程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 排序入門之快速排序簡單入門

排序入門之快速排序簡單入門

編輯:C++入門知識

快速排序被廣泛認為它是解決一般問題的最佳排序算法,它比較適合解決大規模數據的排序。 原理思想:(從小到大) 快速排序首先選取一個“基准數”,通過基准數將大於它和小於它的數無序地放在基准數的兩邊 什麼叫無序?就是大於基准數的所有數只需要放在它的右邊,這些數之間不被要求為有序,同樣,小於基准數的數所有只需要放在它的左邊,不被要求有序 這樣就利用“基准數”對整個原始數列進行了分割成兩部分,然後通過遞歸,用上述同樣的方法選取一個基准數進行分割,直至整個數列被分割的各部分已不能再被分割   下面進行演示,基准數用定義一個變量 pivot 存放,每一部分的分割開始都是選擇low下標對應的數 這裡演示的就是代碼中 partition函數 的實現 開始:(假設low=0,high=6.  當前的low是紅色,high是綠色,pivot是藍色,被放置好在基准數兩邊的數用藍色字體表示) 原始數列a[7] 0 1 2 3 4 5 6 5 4 7 9 2 1 3 首先,選取基准數進行分割,選擇low下標當前的元素5為基准數,即pivot = 5 然後將 pivot 與 high 下標對應的數進行對比 如果 <= a[high],則 low++ 如果 > a[high]  ,則交換 a[low] 與 a[high] 結果如下: 第一次 0 1 2 3 4 5 6 3 4 7 9 2 1 5 從上圖可以看出,a[low] 與 a[high]已被交換 注意! 在這個時候,因 pivot = 5 被交換到 high 的下標處 那麼接下來的比較就是將pivot與low下標當前的數進行對比 如果 >= a[low],則 low++ 如果 < a[low]  ,則交換 a[low] 與 a[high] 這裡是比low對應的數大,結果如下: 第二次 0 1 2 3 4 5 6 3 4 7 9 2 1 5   繼續使用pivot = 5 與 a[low] 進行對比 結果如下: 第三次 0 1 2 3 4 5 6 3 4 7 9 2 1 5   繼續使用 pivot = 5 與 a[low] 進行對比 這時候 pivot = 5比 a[low] 小,所以又進行a[low] 與 a[high]交換 結果如下: 第四次 0 1 2 3 4 5 6 3 4 5 9 2 1 7 注意! 在這個時候,因pivot = 5被交換到low的下標處 那麼接下來的比較就是將pivot與high下標當前的數進行對比 如果 >= a[high],則 high-- 如果 < a[high]  ,則交換 a[low] 與 a[high] 結果如下: 第五次 0 1 2 3 4 5 6 3 4 5 9 2 1 7繼續使用 pivot = 5 與 a[high] 進行對比 同樣進行交換,結果如下: 第六次 0 1 2 3 4 5 6 3 4 1 9 2 5 7繼續使用 pivot = 5 與 a[low] 進行對比 結果如下:(low++) 第七次 0 1 2 3 4 5 6 3 4 1 9 2 5 7繼續使用 pivot = 5 與 a[low] 進行對比 結果如下: 第八次 0 1 2 3 4 5 6 3 4 1 5 2 9 7繼續使用 pivot = 5 與 a[high] 進行對比 結果如下:(high--) 第九次 0 1 2 3 4 5 6 3 4 1 5 2 9 7繼續使用 pivot = 5 與 a[high] 進行對比 結果如下:(最終結果low == high,橙色表示) 第九次 0 1 2 3 4 5 6 3 4 1 2 5 9 7最後由於 low++  所以 low == high 到這裡,已經利用 基准數pivot = 5 把這個數列分為了兩部分(5 的左邊都是小於它的,右邊都是大於它的) 然後遞歸。用同樣的方法,對分割出來的兩部分用“基准數”繼續進行分割   快排函數代碼: [cpp]  //快排函數   void sort(int *s, int low, int high)   {       int    pivot;       //if語句的判斷是結束遞歸的簡單情景,不能缺       if (low < high)       {           // partition 函數就是利用基准數進行分割的功能函數,這個函數是重點           pivot = partition(s, low, high);              sort(s, pivot + 1, high);           sort(s, low, pivot - 1);        }   }   什麼是遞歸的簡單情景?可以看看這裡   partition 函數代碼: [cpp]   //這個函數就是上面演示的代碼實現   int partition(int *s, int low, int high)   {       int    pivot;       pivot = s[low];          while (low < high)       {           while (low < high && pivot <= s[high])           {               high--;           }  www.2cto.com         swap(&s[low], &s[high]);           while (low < high && pivot >= s[low])           {               low++;           }           swap(&s[high], &s[low]);       }       return  low;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved