資料結構學習day1 快速排序

2021-09-25 13:39:32 字數 3312 閱讀 2551

快速排序:

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和key 0

1234

5678

9275

6084

193

i=0, j=9, key=2

第二步:j從後向前搜尋,找到第乙個小於2的值1,交換 0

1234

5678

9175

6084

293

i=0, j=7, key=2

第三步:i從前向後搜尋,找到第乙個大於2的值7,交換 0

1234

5678

9125

6084

793

i=1, j=7, key=2

重複第二步,j從後向前搜尋 0

1234

5678

9105

6284

793i=1, j=4, key=2

重複第三步,i從前向後搜尋

0123456

7891

0265

8479

3i=2, j=4, key=2

重複第二步,j從後向前搜尋,此時i=j=2

0123456

7891

0265

8479

3

第四步:將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

資料結構學習筆記day1

資料結構 c語言版 第1章 編寫 好 的程式 必須要分析待處理的物件的特性以及各處理物件之間存在的關係。1.1 什麼是資料結構 1.用計算機解決具體問題的步驟 1 分析問題 從具體問題抽象出適當的數學模型 2 設計解數學模型的演算法 3 編出程式 4 測試 例1 1 圖書館的書目檢索系統自動化問題。...

資料結構 day1

資料結構往往跟演算法有很大關係 ep1 圖書館 ep2 遞迴函式很有可能導致記憶體溢位 因為每一次遞迴都在記憶體裡新建了乙個 程式 如果遞迴次數過多,那麼這個程式占用的空間會很恐怖 ep3 多項式 正常演算法和秦九韶演算法的比較。秦九韶演算法有效的減少了乘法的量級 clock 獲得從程式開始到呼叫這...

day 1 快速排序

include using namespace std void qsort int a,int low,int high int first low int last high int key a first 用字表的第乙個記錄作為樞軸 while first last a first a las...