詳解快速排序(java實現)

2021-06-29 09:08:25 字數 2168 閱讀 4845

1. 快速排序,是一種高效排序演算法,就如它的名字一樣。它才用分治的思想,每排一次序列,首先會把第乙個數排好位置,同時把這個位置後面所有比這個數小的都挪到前面去,這個位置前面所有比這個數大的數都挪到後面。這樣會把第乙個數放到最終的位置(即排完序後的位置),因為這個位置之前的數即使沒有排序好,但是都比這個位置的數小,而這個位置之後的數都比這個位置的數大。

比如原始資料: [6, 2, 7, 3, 9, 8]

排完一次序後, [3, 2,] 6, [7, 9, 8]

然後我們來詳細解釋一下這一次的排序過程。

首先一開始,我們要排序的資料有6個,從第0個到第5個。

下標:[0, 1, 2, 3, 4, 5]

資料:[6, 2, 7, 3, 9, 8]

定義資料int arr,記錄起始位置int i=0, j=5, 記錄要排的數(通常第乙個數),int k = 6。

第一步,我們根據 j 的定位從後往前找比 k 小的數,當找到j=3時,arr[j]k,我們把這個數挪到後面去,就是arr[j]的位置,因為arr[j]原來的值已經挪到原來arr[i]的位置,即第乙個位置去了。

所以可以直接覆蓋,然後arr變成

下標:[0, 1, 2, 3, 4, 5]

資料:[3, 2, 7, 7, 9, 8]

此時i=2, j=3

然後我們從第一步開始重複,繼續根據 j 的定位從後往前找比 k 小的數,當j遞減到等於2的時候,發現從兩頭過來的定位符 i 和 j 已經碰頭了。此時這一次排序就結束了。

我們可以看到k=arr[0],

第一步是把arr[3]的數挪到arr[0]的位置,就是把3放到了arr[0],

第二步是把arr[2]的數挪到arr[3]的位置,就是把7放到了arr[3],

第二次第一步沒有挪動資料,所以arr[2]的位置就是空出來的,我們把k的值挪到這個位置去,就是arr[i]的位置。其實然後arr變成

下標:[0, 1, 2, 3, 4, 5]

資料:[3, 2, 6, 7, 9, 8]

完成這一次排序後,可以看到第乙個位置的數6,已經來到它最終的位置,前面的數都比它小,後面的數都比它大。

下標:[0, 1, 2, 3, 4, 5]

資料:[3, 2] 6 [7, 9, 8]

完成一次排序後,我們把資料分為了兩份,根據資料6所在位置分隔。此時這兩部分就相當於新的要排序的陣列了。所以根據上面的排序規則,繼續把這兩個部分排序完就可以了。

我們拿出[3, 2]繼續排序,i=0, j=1, k=arr[0]=3.

然後arr[1]k, arr[4]>k, arr[3]==k,發現i=3, j=3,i和j 已經碰頭了。完成排序。arr[3]=k.

這一次完成排序。

然後只剩下[9, 8],沒有排序完了。然後繼續。

i=4, j=5, k=arr[4]=9.

然後arr[5][2, 3, 6, 7, 8, 9]

/**

* * quick sort[6, 2, 7, 3, 9, 8]

* * @param arr 要排序的陣列

* @param left 要排序陣列的起點位置

* @param right 要排序陣列的終點位置

*/public static void quicksort(int arr, int left, int right)

//此時只有兩種情況

//1. i==j,i和j已經碰頭,a[i] = a[j]就是同乙個值賦值

//2. arr[j]k了,找到比k大的資料arr[i]了

//所以這裡可以直接賦值,把arr[i]的資料放到arr[j]的位置去

arr[j] = arr[i];

} //根據上面迴圈最後得到arr[j] = arr[i],所以arr[i]的值已經賦值給別人了,肯定是空出來

//所以這裡把k的值放到arr[i]的位置,而且這個位置就是k排完序後的最終位置

arr[i] = k;

//既然arr[i]的資料已經確定位置了,然後我們只要把arr[i]前面的資料和後面的資料

//分別按照上的步驟再排序即可

//這裡用遞迴實現再恰當不過了,而這個遞迴的出口就是要排序的起點已經大於等於終點了

quicksort(arr, left, i - 1);

quicksort(arr, i + 1, right);

}

排序 快速排序(java實現)

快速排序是一種非常高效的排序演算法,它採用了 分而治之 的思想,把大的拆分成小的,小的再拆分為更小的。其原理如下 對於給定一組記錄,通過一趟排序後,將原序列分為兩部分,其中前一部分的所有記錄都比後一部分的所有記錄小,然後再依次對前後兩部分的記錄進行快速排序,遞迴該過程,直到序列中所有的記錄均為有序為...

Java實現快速排序

package com.handy.ds public class quicksort for int i 0 i a.length i system.out.print a i system.out.println quicksort qs new quicksort qs.quitsort a,...

java實現快速排序

快速排序是平均速度最快的排序演算法,他的平均時間複雜度 n log n 快速排序採用分治法來進行排序,首先先給出乙個陣列,在一開始隨意選擇乙個數pivot,已pivot作為這個陣列的分界點,把大於pivot的數放在右邊,小於pivot的數放在左邊,然後在已pivot的兩邊分界點,右進行一次上一次的操...