zoukankan      html  css  js  c++  java
  • 链表的排序

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

    参考资料:

    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 }
  • 相关阅读:
    mybatis源码解读
    Spring源码解读
    面试题
    ServiceMesh了解一下
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---43
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---42
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---41
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---40
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---37
    《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---36
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5803885.html
Copyright © 2011-2022 走看看