資料結構 快速排序

2022-06-19 21:03:14 字數 3255 閱讀 6352

快速排序:

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 using

namespace

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實現

def

quicksort(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]

print

(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]

def

quick_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...