链表的排序

链表的快速排序与归并排序

 

参考资料:

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("\n");
 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:\n");
190     PrintList(testQuickSort);
191     
192     printf("Quick Sort:\n");
193     LinkQuickSort(testQuickSort, NULL);
194     PrintList(testQuickSort);
195     
196     printf("Merge Sort:\n");
197     LinkMergeSort(&testMergeSort);
198     PrintList(testMergeSort);
199     return  0;
200 }

 

posted @ 2016-08-24 17:25  Juntaran  阅读(362)  评论(0编辑  收藏  举报