快速排序算法說明

快速排序算法的主要思想是分段與遞歸。
分段:取出一個元素,將它放到一個特定位置,是的左邊的數全小,右邊的數全大
遞歸:對左邊的數執行該算法,對右邊的數執行該算法。

那麼,分段過程中,如何找到這樣一個特定的分段位置呢?來看一下算法在遞歸前的運行過程。
假設有一個數組,其中7個數如下圖所示,需要進行快排。
我們需要i,j 做兩個下標,指向數組兩頭,還有一個臨時變量temp,用來當臨時的容器。
首先,取出第一個數放到數組外面,存到temp變量裏最後用,於是5的位置相當於騰空了(藍色標識)。
這裏寫圖片描述

第二步:j方向依次找比5小的數,很巧,3就是,於是3放到原先5的位置,i下標+1;

這裏寫圖片描述
第三步:從i方向開始找比5大的數,4,1,2都比5小,於是i連續移動到了6的位置,將6放入原先3的位置(黃色標識),j下標-1。
這裏寫圖片描述
第四步:從j方向找比5小的數,j–,直到與i重合,也沒再發現比5小的數,此時ij都在6上
這裏寫圖片描述
最後,把最開始放在臨時容器的5放到此時ij重合的位置,這個位置就是之前說的分解位置,再用一個變量k記住這個位置。
剩下的事就是遞歸了,左邊做一次,右邊再做一次,算法完成。
快速排序的代碼不算太長,C語言版本的算法代碼如下:

void QuickSort(int *array,low,high)
{
    if(low>=high)return;
     int i,j;   //記錄數組高低邊界
     int temp;  //存儲臨時取出的數
     int k;     //記錄分解數組下標
     i=low;
     j=high;
     temp=array[i];          //先存下數組第一個數
     while(i<j)
     {
          while(array[j]>temp && i<j)
          {
               j--;           //連續移動j下標,直到找到右邊比temp小的數
          }
          if(i<j)
          {
               array[i]=array[j];
               i++;
          }
          while(array[i]<temp && i<j)
          {
               i++;           //連續移動數組i下標,直到直到左側比temp大的數
          }
          if(i<j)
          {
               array[j]=array[i];
               j--;
          }  
     }
     //出了這個while循環,表明i=j
     array[i]=temp;
     k=i;
     QuickSort(array,low,k-1);
     QuickSort(array,k+1,high);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章