快速排序:
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 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
資料結構學習筆記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...