4 快速排序

2021-10-01 13:18:37 字數 1393 閱讀 3484

快速排序是一種分治的遞迴演算法,從本質上來說,它是歸併排序的就地版本。屬於原址排序。

(1)思路:

把待排列的資料分為兩個子列,從數列中挑出乙個數作為「基準」,然後遍歷其他資料並和「基準」比較,把小於它的放前面,大於它的放後面。之後通過遞迴,將各個子串行劃分為更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列都排序好。

(2)複雜度分析:

(2.1)時間複雜度:

最好情況:樞紐元正好位於中間,因為每次都將序列分為兩個部分(二分),故為o(nlogn)。

最壞情況:樞紐元始終是最小元素, 基本有序,退化為氣泡排序,幾乎要比較

平均情況: o(nlogn)。

(2.2)空間複雜度:

一般情況為o(logn)。快速排序在對序列的操作過程中只需花費常數級的空間。空間複雜度o(1)。 但需要注意遞迴棧上需要花費最少o(logn) 最多o(n)的空間。快速排序空間複雜度只是在通常情況下才為o(logn),如果是最壞情況的話,很顯然就要o(n)的空間了。

(3)穩定性:

快速排序有兩個方向,當a[i]<=a[center_index]時左邊i下標一直往右走,其中center_index是中樞元素的陣列下標,一般取為陣列第0個元素。當a[j]>a[center_index]時右邊的j下標一直往左走,如果i和j都走不動了,i <= j, 交換a[i]和a[j],重複上面的過程,直到i>j,交換a[j]和a[center_index],完成一趟快速排序。

在中樞元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,所以快速排序是乙個不穩定的排序演算法,不穩定發生在中樞元素和a[j]交換的時刻。

舉個例子:待排序陣列:int a =;

在快速排序的隨機選擇比較子(即pivot)階段:

若選擇a[2](即陣列中的第二個2)為比較子,而把大於等於比較子的數均放置在大數陣列中,則a[1](即陣列中的第乙個2)會到pivot的右邊,那麼陣列中的兩個2非原序(這就是「不穩定」)。若選擇a[1]為比較子,而把小於等於比較子的數均放置在小數陣列中,則陣列中的兩個2順序也非原序。

**片段:

void quick_sort(int* arr,int left,int right)

}int partition(int* arr,int left,int right)

arr[left]=arr[right]; //將這個數放到基準的左邊

while( left

arr[right]=arr[left]; //將這個數放到基準的右邊

} arr[left]=base;

for(int h=0;h

printf("一趟排序完成------------------\n");

return left; //返回基準的位置

}

排序 4 快速排序

快速排序和氣泡排序一樣屬於交換排序,它是一種非常高效的排序。它採用了一種分治的策略,把大的拆分成 小的,再把小的拆分為更小的。快速排序是一種不穩定的排序 時間複雜度 最好情況 o nlogn 最壞情況 o n2 平均情況 o nlogn 空間複雜度 o logn 那麼快速排序主要是什麼思想呢?對於一...

4 快速排序

2015,煙台大學計算機與控制工程學院 檔名稱 haxibiao.cpp 完成日期 2015年12月14日 問題描述 用序列作為測試資料,1 直接插入排序 2 希爾排序 3 氣泡排序 4 快速排序 5 直接選擇排序 6 堆排序 7 歸併排序 8 基數排序。include define maxsize...

排序演算法4 快速排序

編寫乙份快速排序,完成對元素序列37,19,43,22,22,89,26,92按照從小到大順序排列。演算法思想 快速排序是氣泡排序演算法的改進,也屬於交換型別的排序演算法,它的基本思想描述如下 1 從第j個元素開始向前依次將每個元素與樞軸元素pivot比較。如果當前元素大於pivot,則比較前乙個元...