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

    快排最核心的思想就是划分,确定一个枢轴元素(pivot),每一趟划分的目的就是把待排序列分为两部分,前一部分比枢轴小(序列A),后一部分比枢轴大(序列B)。经过一趟划分之后序列变为:{A} pivot {B}。以下是具体步骤:
    1、确定每一次划分的枢轴元素为当前待排序列的头节点。
    2、设置Slow和Fast两个游标,Slow指向序列A中的最后一个元素,初始化为枢轴本身(待排序列头节点)。让Fast遍历一遍待排序列,当所指元素比枢轴小时,将Slow往前游一格,交换Slow和Fast所指元素的值,这样仍能保证Slow指向的元素是序列A中的最后一个元素。
    3、交换Slow所指元素和枢轴元素的值。
    4、对序列A和B重复步骤1~4。

    下面是单链表快速排序算法的Java实现:
    1、单链表节点的定义。

    [java] view plaincopy
     
      1. /** 
      2.  * @param ListHead 待排序列的头节点 
      3.  * @param ListEnd 待排序列的尾节点 
      4.  */  
      5. public static void qsort(Element ListHead, Element ListEnd) {  
      6.     if (ListHead == null || ListEnd == null)  
      7.         return;  
      8.     if (ListHead == ListEnd) {  
      9.         return;  
      10.     }  
      11.     //Slow游标,指向序列A的最末尾元素。  
      12.     Element Slow = ListHead;  
      13.     //Fast游标,用于遍历整个待排序列。  
      14.     Element Fast = ListHead.next;  
      15.     //TempEnd游标,总是指向Slow游标的前驱节点,递归调用时需要。  
      16.     Element TempEnd = ListHead;  
      17.     int temp;  
      18.     while (Fast != null) {  
      19.         //当前节点的值比枢轴小,进行交换。  
      20.         if (Fast.data < ListHead.data) {  
      21.             //TempEnd游标总是指向Slow的前驱。  
      22.             TempEnd = Slow;  
      23.             Slow = Slow.next;  
      24.    
      25.             //交换Slow和Fast游标所指的元素的值  
      26.             temp = Slow.data;  
      27.             Slow.data = Fast.data;  
      28.             Fast.data = temp;  
      29.         }  
      30.         Fast = Fast.next;  
      31.     }  
      32.    
      33.     //交换Slow游标所指的元素和枢轴元素的值,使序列成为{A} povit {B}形式  
      34.     temp = ListHead.data;  
      35.     ListHead.data = Slow.data;  
      36.     Slow.data = temp;  
      37.    
      38.     //递归调用  
      39.     qsort(ListHead, TempEnd);  
      40.     qsort(Slow.next, ListEnd);  
      41. }  
  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/davidshi/p/3340742.html
Copyright © 2011-2022 走看看