排序演算法 快速排序法

2021-10-01 22:53:34 字數 1871 閱讀 9113

1、無論是冒泡法、堆排序法還是歸併法排序,都是重複找到陣列中剩餘未排序元素的最大或最小值,然後將每次找到的最大或最小值依次放進陣列中就可以得到乙個有序的陣列。快速排序法也與其類似,但不同的是,快速排序是通過任意指定陣列中的乙個元素作為基準,比該元素大的放在右邊,比該元素小的放在左邊,這樣就可以保證指定的這個元素一定會處於有序陣列中的位置,然後再分別對左邊和右邊的未排序元素重複進行該步驟(在未排序的元素中指定新基準元素,然後查詢該基準元素在有序情況下所應該在的位置,然後與該位置的元素進行交換),就可以將實現排序。

2、演算法核心:快速排序的演算法核心就在於以陣列中的乙個元素作為基準,如何實現比該元素大的放在右邊,比該元素小的放在左邊,也就是基準元素在有序陣列中的位置查詢,基準元素通常指定陣列中最後乙個元素。演算法步驟如下

(1)首先需要乙個下標來記錄基準元素的下標位置,為m;

(2)其次還需要用ij來標記大於基準元素的元素下標區間,i(3)由 j 負責向後遍歷,如果 j++後遇到小於基準元素的,那麼就需要將arr[j]與arr[i]的值交換,並且i++。

(4)如果j++後遇到的值是大於基準元素,那麼就不執行i++,繼續執行j++訪問下乙個元素。

(5)保證下標 i與j 之間的元素都是大於基準元素的,直到 j 的值為m-1。此時 arr[i]到arr[j]之間的就全部為大於基準元素的,此時只需要將 arr[m]與arr[i]的值進行交換,就能實現比基準元素大的放在右邊,比基準元素小的放在左邊。

3、演算法核心例項:以陣列 arr=[ 12,32,4,23,45,66,21 ] 為例,基準元素下標為 m=arr.length,也就是最後乙個元素21

(1)從下標j= i=0開始,arr[j] =12 小於21,不屬於大於基準元素區間的,arr[i]和arr[j]交換值,i++,j++,跳轉至下乙個元素。(i=1,j=1)

(2)對於arr[j] = 32大於21,所以 i 不變,j++。(i=1,j=2)

(3)對於 arr[j] = 4小於21,所以arr[i]和arr[j]交換值,i++,j++,跳轉至下乙個元素,此時陣列形式[ 12,4,32,23,45,66,21 ]。(i=2,j=3)

(4)對於 arr[j] = 23大於21,所以 i 不變,j++。(i=2,j=4)

(5)對於 arr[j] = 45 , i 不變,j++。(i=2,j=5)

(6)對於 arr[j] = 66 , i 不變,j++。(i=2,j=6)

(7)j= m-1,遍歷結束,將arr[i] 和arr[m]的值交換,即可得到 [ 12,4,21,23,45,66,32 ]

4、基準元素在有序陣列中的位置查詢核心演算法思想完成,現在就只需要考慮如何對陣列中的每乙個元素都進行一次位置查詢,通過遞迴,對基準元素兩邊的其他元素分別進行遞迴呼叫即可實現排序。具體實現**如下

public class sort 

int i = right;

for (int j = right; j<=left-1; j++) else

}int temp = arr[left];

arr[left] = arr[i];

arr[i] = temp;

//對左邊的元素進行排序

sort(arr, right, i-1);

//對右邊元素進行排序

sort(arr, i+1, left);

return arr;

}public static void main(string args) ;

for(int i:sort(arr,0,arr.length-1)) }}

C 排序演算法 快速排序法

在閱讀此博文前,請先閱讀我的博文 排序演算法 基類設計 以了解基類的結構。在編寫 前,我們先來了解二路歸併法的排序過程 假設有乙個ilist型的集合list 集合的元素為list 0 到list n 1 n list.count 第1步 從a 0 n 1 中選擇乙個元素作為middle,該元素為支點...

排序演算法 快速排序(分治法)

思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...

演算法排序(六) 快速排序法

快速排序法一般來說可以分為三種,分別是 基礎快速排序法 雙路快速排序法 三路快速排序法 下面分別對以上三種快排進行梳理。排序思路 首先傳入待排序陣列,使用變數l表示陣列下標起點,使用變數r表示陣列下標終點,然後取陣列第乙個元素e做中介,使用迴圈逐步將陣列元素分為比e小和不比e小的兩部分 使用變數j記...