链表的快速排序与归并排序
参考资料:
http://www.acmerblog.com/merge-sort-for-linked-list-5371.html
http://blog.csdn.net/cwqbuptcwqbupt/article/details/6902173
1 /************************************************************************* 2 > File Name: LinkSort.c 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年08月24日 星期三 17时23分04秒 6 ************************************************************************/ 7 8 #include <stdio.h> 9 #include <malloc.h> 10 11 /************************************************************************/ 12 // 初始准备工作 13 14 // 链表结构体 15 struct ListNode 16 { 17 int val; 18 struct ListNode* next; 19 }; 20 21 // 构造链表 22 ListNode* createList(int data[], int length) 23 { 24 struct ListNode* head; 25 struct ListNode* p; 26 struct ListNode* q; 27 head = p = (ListNode*)malloc(sizeof(ListNode)); 28 head->val = data[0]; 29 for (int i = 1; i < length; ++i) 30 { 31 q = (ListNode*)malloc(sizeof(ListNode)); 32 q->val = data[i]; 33 p->next = q; 34 p = q; 35 } 36 p->next = NULL; 37 return head; 38 } 39 40 // 顺序输出链表 41 void PrintList(ListNode* head) 42 { 43 if (head == NULL) 44 return; 45 ListNode* temp = head; 46 while (temp != NULL) 47 { 48 printf("%d ", temp->val); 49 temp = temp->next; 50 } 51 printf(" "); 52 } 53 54 /************************************************************************/ 55 56 /************************************************************************/ 57 // 快速排序 58 59 // 交换元素 60 void swap(ListNode* a, ListNode* b) 61 { 62 int temp = a->val; 63 a->val = b->val; 64 b->val = temp; 65 } 66 67 // 找到Flag 68 ListNode* getFlag(ListNode* left, ListNode* right) 69 { 70 ListNode* p = left; 71 ListNode* q = left->next; 72 int key = p->val; 73 while (q != right) 74 { 75 if (q->val < key) 76 { 77 p = p->next; 78 swap(p, q); 79 } 80 q = q->next; 81 } 82 swap(left, p); 83 return p; 84 } 85 86 // 核心代码 87 void LinkQuickSort(ListNode* left, ListNode* right) 88 { 89 if (left != right) 90 { 91 ListNode* flag = getFlag(left, right); 92 LinkQuickSort(left, flag); 93 LinkQuickSort(flag->next, right); 94 } 95 } 96 97 /************************************************************************/ 98 99 /************************************************************************/ 100 // 归并排序 101 102 ListNode* Merge(ListNode* a, ListNode* b); 103 104 // 分割链表函数 105 void SplitLink(ListNode* source, ListNode** a, ListNode** b) 106 { 107 ListNode* fast; 108 ListNode* slow; 109 if (source==NULL || source->next==NULL) 110 { 111 *a = source; 112 *b = NULL; 113 } 114 else 115 { 116 slow = source; 117 fast = source->next; 118 119 while (fast != NULL) 120 { 121 fast = fast->next; 122 if (fast != NULL) 123 { 124 slow = slow->next; 125 fast = fast->next; 126 } 127 } 128 129 *a = source; 130 *b = slow->next; 131 slow->next = NULL; 132 } 133 } 134 135 136 // 排序 137 void LinkMergeSort(ListNode** head) 138 { 139 ListNode* newHead = *head; 140 ListNode* a; 141 ListNode* b; 142 143 if (newHead==NULL || newHead->next==NULL) 144 return; 145 146 // 分割链表为a,b 147 SplitLink(newHead, &a, &b); 148 149 // 递归 150 LinkMergeSort(&a); 151 LinkMergeSort(&b); 152 153 // 合并a, b 154 *head = Merge(a, b); 155 } 156 157 // 合并已排序链表 158 ListNode* Merge(ListNode* a, ListNode* b) 159 { 160 ListNode* newHead = NULL; 161 if (a == NULL) 162 return b; 163 if (b == NULL) 164 return a; 165 166 // 递归 167 if ( a->val <= b->val) 168 { 169 newHead = a; 170 newHead->next = Merge(a->next, b); 171 } 172 else 173 { 174 newHead = b; 175 newHead->next = Merge(a, b->next); 176 } 177 return newHead; 178 } 179 180 /************************************************************************/ 181 182 183 int main() 184 { 185 int length = 10; 186 int data[] = {9,5,6,8,4,4,7,2,3,7}; 187 ListNode* testQuickSort = createList(data, length); 188 ListNode* testMergeSort = createList(data, length); 189 printf("Before sort: "); 190 PrintList(testQuickSort); 191 192 printf("Quick Sort: "); 193 LinkQuickSort(testQuickSort, NULL); 194 PrintList(testQuickSort); 195 196 printf("Merge Sort: "); 197 LinkMergeSort(&testMergeSort); 198 PrintList(testMergeSort); 199 return 0; 200 }