快排Java代码实现(Quick Sort)
1.? 快排算法思路
基本思想:通過一趟快速排序將待排數組分割成獨立的兩份部分;?其中一部分數組的值均比另一部分數組的值小,則可分別對著兩部分數組繼續進行排序,以達到整個序列有序。
快排的平均時間復雜度為n*log(n),最壞的時間復雜度為?n^2。
一趟快速排序:首先先選一個值(通常選擇數組第一個值)作為樞軸,然后按下述原則重新排列其余的值,將數組中所有小于樞軸的值放在樞軸前面,數組中所有大于樞軸的值放在樞軸后面。將樞紐最后的位置作為分界線,將數組分成兩部分(兩部分均不包含樞軸),這個過程稱作一趟快速排序。
一趟快速排序的具體做法:
1.? 設兩個指針?low?和?high ,?他們的初始值分別為數組開始的下標 start,數組結束的下標end
2.??樞軸值為?pivotKey
3.? ?則首先從?high?所指位置向前搜索,搜索到第一個小于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。
4.? 從?low?所指位置向后搜索,搜索到第一個大于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。
5.? 重復前兩步操作(3,4),直至?low ==?high 。
2.? Java?代碼實現
完全按照上面的思路的?Java?代碼如下:
package sort;/*** 快速排序(Quick Sort) Java代碼實現* 快排時間復雜度:n*log(n)*/public class MySort {public static void main(String args[]) {int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27};MySort mySort = new MySort();System.out.print("排序前的數組: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的結果: ");PrintArray(arr, 0, arr.length-1);}/*** 對數組 arr 下標從 start 到 end 的內容進行排序* @param arr:待排序數組* @param start:開始的下標* @param end:結束的下標*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.? 設兩個指針?low?和?high ,他們的初始值分別為數組開始的下標 start,數組結束的下標endint low = start;int high = end;// 2.??樞軸值為?pivotKeyint pivotKey = arr[start];// 5. 重復前兩步操作(3,4),直至?low ==?highwhile (low<high) {// 3. 首先從?high?所指位置向前搜索,搜索到第一個小于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換while (low<high && arr[high]>=pivotKey) {--high;}int temp1 = arr[low];arr[low] = arr[high];arr[high] = temp1;// 4. 從?low?所指位置向后搜索,搜索到第一個大于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。while (low<high && arr[low]<=pivotKey) {++low;}temp1 = arr[low];arr[low] = arr[high];arr[high] = temp1;}// 對 小于樞軸值的那部分數組值 進行快排quickSort(arr, start, low-1);// 對 大于樞軸值的那部分數組值 進行快排quickSort(arr, low+1, end);}/***輸出數組中的值* @param arr:數組* @param start:數組開始的下標* @param end:數組結束的下標*/public static void PrintArray(int[] arr, int start, int end) {for (int i=start; i<=end; i++) {System.out.print(arr[i] + " ");}System.out.println("");} }運行可得 :
? ? ? ? ? ? ? ? ? ? ??
3.? 簡單的優化
進行一次數值交換,如 :temp1 = arr[low]; arr[low] = arr[high]; arr[high] = temp1,需要三次賦值,temp1 = arr[low]; arr[high] = temp1?這兩次賦值其實是多余的,因為?當?low ==?high ,?也就是最終的位置?low ,就是樞軸值的位置,我們只需要在一次快排結束后將樞軸值放到?low?位置就可以了。Java源碼如下。
package sort;/*** 快速排序(Quick Sort) Java代碼實現* 快排時間復雜度:n*log(n)*/public class MySort {public static void main(String args[]) {int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27};MySort mySort = new MySort();System.out.print("排序前的數組: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的結果: ");PrintArray(arr, 0, arr.length-1);}/*** 對數組 arr 下標從 start 到 end 的內容進行排序* @param arr:待排序數組* @param start:開始的下標* @param end:結束的下標*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.? 設兩個指針?low?和?high ,他們的初始值分別為數組開始的下標 start,數組結束的下標endint low = start;int high = end;// 2.??樞軸值為?pivotKeyint pivotKey = arr[start];// 5. 重復前兩步操作(3,4),直至?low ==?highwhile (low<high) {// 3. 首先從?high?所指位置向前搜索,搜索到第一個小于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換while (low<high && arr[high]>=pivotKey) {--high;}arr[low] = arr[high];// 4. 從?low?所指位置向后搜索,搜索到第一個大于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。while (low<high && arr[low]<=pivotKey) {++low;}arr[high] = arr[low];}// 一次快排結束后將樞軸值放到?low?位置arr[low] = pivotKey;// 對 小于樞軸值的那部分數組值 進行快排quickSort(arr, start, low-1);// 對 大于樞軸值的那部分數組值 進行快排quickSort(arr, low+1, end);}/***輸出數組中的值* @param arr:數組* @param start:數組開始的下標* @param end:數組結束的下標*/public static void PrintArray(int[] arr, int start, int end) {for (int i=start; i<=end; i++) {System.out.print(arr[i] + " ");}System.out.println("");} }運行截圖 :
4.? 優化措施
優化最壞的情況:在選擇樞軸,取數組的第一個元素、中間的那個元素、最后一個元素的中位數作為樞軸。
優化最好的情況:添加兩個?布爾類型 變量,如果?指針low?從低端向中間的移動過程中沒有交換記錄,則不需要對樞軸左部分的元素排序;如果?指針high?從高端向中間的移動過程中沒有交換記錄,則不需要對樞軸右部分的元素排序,這樣就可能達到n的時間復雜度。
5.? 參考文獻
數據結構 -? 嚴蔚敏、吳偉民 -? 清華大學出版社
總結
以上是生活随笔為你收集整理的快排Java代码实现(Quick Sort)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式测试自动化框架搭建
- 下一篇: 2022春招前端最新面试题分享(牧原股份