快速排序:
1. 設定變數i=0, j=n-1,設定關鍵資料,也就是比較的資料key,key可以隨便取,也可以取key=a[0]
2. 從j開始向前搜尋(j--),找到第乙個小於key的值a[j],將a[j]的值賦給a[i];
3. 從i開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]的值賦給a[j];
4. 重複第2、3步,直到i=j; (2,3步中,沒找到符合條件的值,即2中a[j]不小於key,3中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)
演示:
第一步:設定i,j和key01
2345
6789
2756
0841
93i=0, j=9, key=2
第二步:j從後向前搜尋,找到第乙個小於2的值1,交換01
2345
6789
1756
0842
93i=0, j=7, key=2
第三步:i從前向後搜尋,找到第乙個大於2的值7,交換01
2345
6789
1256
0847
93i=1, j=7, key=2
重複第二步,j從後向前搜尋01
2345
6789
1056
2847
93i=1, j=4, key=2
重複第三步,i從前向後搜尋01
2345
6789
1026
5847
93i=2, j=4, key=2
重複第二步,j從後向前搜尋,此時i=j=201
2345
6789
1026
5847
93第四步:將key左邊和右邊的再分別進行以上步驟排序,直到最終排好
c++實現:
#include usingnamespace
std;
void qsort(int a, int low, int
high)
int first =low;
int last =high;
int key = a[first];/*
用字表的第乙個記錄作為樞軸
*/while(first a[first] = a[last];/*
將比第乙個小的移到低端
*/while(first < last && a[first] <=key)
a[last] =a[first];
/*將比第乙個大的移到高階*/}
a[first] = key;/*
樞軸記錄到位
*/qsort(a, low, first-1
); qsort(a, first+1
, high);
}int
main()
; qsort(a,
0, sizeof(a) / sizeof(a[0]) - 1);/*
這裡原文第三個引數要減1否則記憶體越界
*/for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
return0;
}/*參考資料結構p274(清華大學出版社,嚴蔚敏)
*/
python實現
defquicksort(list,low,high):
if high >low:
#傳入引數,通過partitions函式,獲取k下標值
left =low
right =high
#將最左側的值賦值給參考值k
k =list[low]
#當left下標,小於right下標的情況下,此時判斷二者移動是否相交,若未相交,則一直迴圈
while left #當left對應的值小於k參考值,就一直向右移動
while list[left] <=k:
left += 1
#當right對應的值大於k參考值,就一直向左移動
while list[right] >k:
right = right - 1
#若移動完,二者仍未相遇則交換下標對應的值
if left list[left],list[right] =list[right],list[left]
#若移動完,已經相遇,則交換right對應的值和參考值
list[low] =list[right]
list[right] =k
quicksort(list,low,right-1)
#遞迴排序列表k下標右側的列表
quicksort(list,right+1,high)
list_demo = [6,1,2,7,9,3,4,5,10,8]
(list_demo)
quicksort(list_demo,0,9)
print(list_demo)
輸出:
[6, 1, 2, 7, 9, 3, 4, 5, 10, 8][1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
defquick_sort(data):
"""快速排序
"""if len(data) >= 2: #
遞迴入口及出口
mid = data[len(data)//2] #
選取基準值,也可以選取第乙個或最後乙個元素
left, right = , #
定義基準值左右兩側的列表
data.remove(mid) #
從原始陣列中移除基準值
for num in
data:
if num >=mid:
else
:
return quick_sort(left) + [mid] +quick_sort(right)
else
:
return data
資料結構 排序 快速排序
對序列 47,31,83,91,57,18,96,16 進行快速排序 首元素為基準 第二趟排序結果是 正確答案 b 你的答案 c 錯誤 18 31 16 47 57 91 96 83 16 31 18 47 57 91 96 83 16 18 31 47 57 91 96 83 16 18 31 4...
資料結構 排序 快速排序
快速排序在平均情況下是效果最好的排序演算法 每趟子表的排序都是從兩頭向中間交替逼近,接下來舉乙個例子 sorry,上面這個圖的6和5的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...
資料結構排序 快速排序
快速排序是對氣泡排序的改進,它的基本思想是通過一趟排序將資料分成兩部分,一部分中的資料都比另一部分中的資料小,再對這兩部分中的資料再排序,直到整個序列有序,如下圖所示。快排的遞迴實現 1 include 2 include 3 4intn 5 6 7 分割使樞軸記錄的左邊元素比右邊元素小8 9int...