排序 快速排序

2022-08-10 08:45:14 字數 2649 閱讀 6825

1.選取樞紐元:三數中值分割法,得到的中間值即作為mid,將陣列分為arrays[mid]左邊的比它小,右邊的比它大

2.進行劃分partition:首先將arrays[mid]放在arrays[high]處,然後對陣列範圍內的數值進行比較,

(左右兩邊分別有乙個指標來進行尋找,arrays[left] <= arrays[high],arrays[right] >= arrays[high])找到不符合要求的值,在左右交換位置。

在left>=right時,終止查詢,然後將swap(arrays, left, high);即可將樞紐元放入合適的位置

3.迴圈進行左右兩側的選擇樞紐元,劃分

注意:在partition之後,傳回來的是劃分好之後arrays[mid]應該在的位置,而不再是mid處了

排序中的劃分部分可以衍生出很多的問題:

資料結構--荷蘭國旗問題

利用荷蘭國旗問題的解法衍生出的隨機快排解法

注意在生成隨機數時,是 (int)(math.random() * (right - left + 1))+ left

快排優化:

* 1.使用荷蘭國旗法進行劃分

* 2.使用隨機快排:將一直選取最後乙個數進行比較的經典快排,改為隨機選取乙個數進行比較

* 生成隨機數的方法 int num = (int)(math.random()*(high - low + 1)+ low

);* 使用空間複雜度o(logn),用來記錄各個遞迴中的斷點,用來進行另外一半的遞迴

* 工程上快排是非遞迴的

public void quicksort(integer arrays)

//隨機快排

public void randomquicksort(integer arrays, int left, int right)

public int partitionrandom(integer arrays, int left, int right) else if(arrays[left] > arrays[right]) else

}swap(arrays, right, high);

return new int;

}

一般的解法

package sort;

import static sort.printres.swap;

/** * created by skye on 2018/3/27.

*/public class quicksort

public void quicksort(integer arrays, int low, int high)

public int threemid(integer arrays, int low, int high)

public int partition(integer arrays, int low, int high)

while(right > left && arrays[right] >= arrays[high])

swap(arrays, left, right);

}swap(arrays, left, high);

return left;

}}

注意:可以將交換改成覆蓋,來減少交換次數  將partition方法修改

對於小陣列,可以將排序改為插入排序quicksort(integer arrays, int low, int high)修改

還可以將遞迴改成尾迭代:(不太懂)

最終版

package sort;

import static sort.printres.swap;

public class quicksort

public void quicksort(integer arrays, int left, int right) else

arrays[j + 1] = temp;}}

}public int threemid(integer arrays, int left, int right)

public int partition(integer arrays, int left, int right)

//相當於交換arrays[left] arrays[right],交換後,right-1(開始時,right處放置的是樞紐元的值,就是將樞紐元覆蓋掉)

arrays[high--] = arrays[low];

while(high > low && arrays[high] >= temp)

//相當於交換arrays[left] arrays[right],交換後,left+1(此時,arrays[left]的值已經存放在arrays[right]中了)

arrays[low++] = arrays[high];

}//最後再將樞紐元放回到陣列中

arrays[low] = temp;

return low;

}}

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是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...