排序中的快速排序

2021-08-09 18:43:10 字數 1637 閱讀 6839

思想:

通過乙個陣列劃分成兩個子陣列,然後通過遞迴呼叫把每個陣列進行再分,直到排序完成。

劃分:通過在陣列中找到乙個關鍵字,進行劃分 小的都在左邊,大的都在右邊,

1)、設定兩個變數i、j,排序開始的時候i:=1,j:=n;

2)以第乙個陣列元素作為關鍵資料,賦值給x,即x:=a[1];

3)、從j開始向前搜尋,即由後開始向前搜尋(j:=j-1),找到第乙個小於x的值,兩者交換;

4)、從i開始向後搜尋,即由前開始向後搜尋(i:=i+1),找到第乙個大於x的值,兩者交換;

5)、重複第3、4步,直到i=j;

程式執行過程數字變化是這樣的

49 38 65 97 76 13 27

第乙個數字以49為key

先從最右邊找比49小的 27符合 因為左邊第乙個就是49 49=49 所以在49這裡卡住了 等著右邊來換 所以 array[start]=array[end]; 變成了

27 38 65 97 76 13 27

這時候右邊找比49小的 27並沒有賦值 等著左邊找到乙個比49大的轉換位置 找到65 然後 array[end]=array[start]; 所以數字順序變成了

27 38 65 97 76 13 65

以此類推 左邊賦完值 左邊這個就比49大 所以卡住了 然後在右邊找比49小的值 找到13 array[start]=array[end]; 變成了

27 38 13 97 76 13 65

然後 右邊卡住 再從左邊找 變成了 27 38 13 97 76 97 65

然後 左邊卡住 再從右邊找比49小的 沒有找到 start=3 end=3

然後再把key值賦值給arr[end] 所以第一次排序完順序是 27 38 13 49 76 97 65

再進行遞迴….

public

class sort ;

sort(arr,0,arr.length-1);

for(int i=0;i" ");

}}public

static

void sort(int array,int start ,int end)

int index=partition(array,start,end);

sort(array,start,index-1);

sort(array,index+1,end);

//通過遞迴呼叫

}public

static

int partition(int array,int start ,int end)

array[start]=array[end];

while(array[start]<=key&&end>start)

array[end]=array[start];

//別以為這裡錯了 其實這裡面都有兩個一樣的數字 每次的key值都被別的替代了 等到後面會把最後key應該待的地方賦值成key的值 (因為每次轉換地方太麻煩了

}array[end]=key;

return end;

}}

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...

排序 快速排序

定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...

排序 快速排序

時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...