1、快速排序法概念python
快速排序(Quick Sort)法是對冒泡排序的一種改進,其基本思想是:經過一遍排序將須要排序的數據劃分紅兩部分,使其中一部分數據比另外一部分數據小,而後再分別對這兩部分數據繼續進行這種排序,按此規則繼續,直到每一個部分爲空或只含一個數時,整個快速排序結束。這是一種分治策略,將大批的數據逐步分解,可以使用遞歸的方法編寫程序,使程序更簡潔。算法
2、算法描述數組
快速排序使用分治策略來把待排序數據序列分爲兩個子序列,具體步驟爲:
(1)從數列中挑出一個元素,稱該元素爲「基準」。
(2)掃描一遍數列,將全部比「基準」小的元素排在基準前面,全部比「基準」大的元素排在基準後面。
(3)經過遞歸,將各子序列劃分爲更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列
排序。
下面以一組待排序的數據演示快速排序的過程,假設有8個須要排序的數據序列以下:
69,65,90,37,92,6,28,54
假設數組A中保存着這8個數據,其排序過程如圖下圖所示。app
(1)在變量left中保存數組的最小序號0,在變量right中保存數組的最大序號7,在變量base中保存數組的第1個元素A[0]做爲基準。如上圖所示。less
(2)從數組右側開始,逐個取出元素與base比較,直到找到比base小的數據爲止。在本例中,數組最右側的元素A[right]的值54就比base變量中保存的值69小。
(3)將右側比基準base小的數(數組元素A[right]中的數)保存到A[left](A[0])元素中。
(4)接下來,從數組左側開始,逐個取出元素與base比較,直到找到比base大的數據爲止。在本例中,數組最左側的元素A[left](即A[0])的值爲54,比base的值小,將left自增1(值爲1)。再取A[left](A[1])的值65與base的值69比較,65<69,繼續將left自增1(值爲2)。再取A[left](A[2])的值90與base比較,因90>69,結束查找。
(5)將左側比基準base大的數(數組元素A[2])保存到A[right](A[7])元素中。
(6)將base中的值保存到A[left](A[2])中。通過這些運算,獲得如圖4-6b所示的效果。
提示 通過這一次分割,base數據左側(也就是left所指向的數據)的數比base小,而base數據右側的數比base大。
(7)接下來,經過遞歸調用,將left左側的數據進行一樣的排序,再將left右側的數據進行一樣的排序。測試
通過這樣的遞歸調用,最終可將數據完成排序操做。
從前面的分析可知,快速排序是一個遞歸過程,其算法描述以下:
void快速排序(數組,左側序號,右側序號)
{
分割數據,將left保存到i
快速排序(數組,原左側序號,i-1);
快速排序(數組,i+1,原右側序號);
}ui
3、快速排序法的實現code
(1)快速排序法
排序
int Division(int a[], int left, int right) { int base = a[left]; while (left < right) { while (left<right && a[right]>base) --right; a[left] = a[right]; while (left<right && a[left]<base) ++left; a[right] = a[left]; } a[left] = base; return left; } void QuickSort(int a[], int left, int right) { int i, j; if (left<right) { i = Division(a, left, right); QuickSort(a, left, i-1); QuickSort(a, i+1, right); } }
(2)數組顯示遞歸
void ShowData(int arr[], int n) { int i; for (i=0; i<n; i++) printf("%d ", arr[i]); printf("\n"); return; }
(3)測試
#define ARRAYLEN 10 int main(int argc, char *argv[]) { int i; int a[ARRAYLEN] = {94, 84, 54, 80, 62, 83, 37, 24, 67, 29}; printf("原數據:"); ShowData(a, ARRAYLEN); QuickSort(a, 0, ARRAYLEN-1); printf("排序後:"); ShowData(a, ARRAYLEN); return 0; }
(4)運行結果
4、python實現快速排序法
#!/usr/bin/env python # -*- coding: utf-8 -*- def quicksort(array): less = [] greater = [] if len(array) <= 1: return array pivot = array.pop() for x in array: if x <= pivot: less.append(x) else: greater.append(x) return quicksort(less) + [pivot] + quicksort(greater) if __name__ == "__main__": array = [94, 84, 54, 80, 62, 83, 37, 24, 67, 29] print "原數據:", array sort_array = quicksort(array) print "排序後:", sort_array
運行結果