首页 > 代码库 > LeetCode | Insertion Sort List
LeetCode | Insertion Sort List
//// main.c// InsertionSortList//// Created by weilian on 14/12/12.// Copyright (c) 2014年 weilian. All rights reserved.//#include <stdio.h>#include <stdlib.h>typedef struct ListNode *List;typedef List ptrNode;//节点的定义struct ListNode{ int Element; struct ListNode *Next;};void InsertSort(int A[] , int N);//插入排序的数组版本void ListInsertSort(List A); //插入排序的链表版本void ListInsert(int N , List H);//链表操作,生成一个链表int main(int argc, const char * argv[]) { int A[15] = {1,2,3,4,5,6,7,8,9,10,28,15,0,20,2}; List H = malloc( sizeof(struct ListNode)); if (H ) { H->Element = 0 ; H->Next = NULL ; } //生成一个链表 for (int i = 0 ; i < 15 ; i++) { ListInsert(A[i] , H); } //链表的插入排序 ListInsertSort(H); //打印排好序的链表 List h = H->Next; while (h) { printf("%d ", h->Element); h = h->Next; } //下面被注释的部分,是数组插入排序的测试版本 //int A[15] = {1,2,3,4,5,6,7,8,9,10,28,15,0,20,2}; //InsertSort( A , 15); //for (int i = 0 ; i < 15; i++) { // printf("%d ", A[i]); //} return 0;} // 插入排序的数组实现版本void InsertSort(int A[] , int N){ int i , j ; int Tmp ; for (i = 1 ; i < N ; i++) { Tmp = A[i]; /* 这段代码是错误的,不过我还没发现错在哪 for ( j = i ; j>= 1 ; j--) { if (A[j-1] > Tmp) A[j] = A[j-1]; } */ for (j = i ; j > 0 && A[j-1] > Tmp ; j --) A[j] = A[j-1]; A[j] = Tmp ; }}//插入排序的链表版本// 其基本思想是:TheCurrentPosition从第二个节点开始,直到最后一个节点// 每到一个节点,TheHeadList 就从第一节点开始往后走,寻找第一个大于此节点的节点// 然后思想和插入排序一样,往后交换数据就可以了// 运用归纳法证明自己的程序是正确的// 网上的实现版本是再建一个表头,用双表来实现,从当前表取出一个节点// 然后运用链表的插入操作来实现排序。// 都差不多void ListInsertSort(List A){ if (A == NULL ||A->Next == NULL) return ; List TheHeadOfList , TheCurrentPosition; int Tmp , Tmp2; TheHeadOfList = A->Next; // 这个指针始终指向第一个节点 TheCurrentPosition = TheHeadOfList->Next; while (TheCurrentPosition) { // 寻找第一个大于TheCurrentPosition的值 while (TheHeadOfList->Element < TheCurrentPosition->Element && TheHeadOfList != TheCurrentPosition ) TheHeadOfList = TheHeadOfList->Next; Tmp = TheCurrentPosition->Element; //从当前节点往后交换数据 while (TheHeadOfList != TheCurrentPosition->Next) { Tmp2 = TheHeadOfList->Element; TheHeadOfList->Element = Tmp; Tmp = Tmp2; TheHeadOfList = TheHeadOfList->Next; } //以上完成后,进入下一个节点,TheHeadList初始为初始节点 TheCurrentPosition = TheCurrentPosition->Next; TheHeadOfList = A->Next; }}//链表的插入操作void ListInsert(int N , List H){ ptrNode TmpNode; TmpNode = (ptrNode) malloc(sizeof(struct ListNode)); TmpNode->Element = N ; TmpNode->Next = H->Next; H->Next = TmpNode; }
LeetCode | Insertion Sort List
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。