日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

快排Java代码实现(Quick Sort)

發(fā)布時間:2023/12/31 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快排Java代码实现(Quick Sort) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.? 快排算法思路

基本思想:通過一趟快速排序待排數(shù)組分割成獨立的兩份部分;?其中一部分?jǐn)?shù)組的值均比另一部分?jǐn)?shù)組的值小,則可分別對著兩部分?jǐn)?shù)組繼續(xù)進行排序,以達到整個序列有序。

快排的平均時間復(fù)雜度為n*log(n),最壞的時間復(fù)雜度為?n^2。

一趟快速排序:首先先選一個值(通常選擇數(shù)組第一個值)作為樞軸,然后按下述原則重新排列其余的值,將數(shù)組中所有小于樞軸的值放在樞軸前面,數(shù)組中所有大于樞軸的值放在樞軸后面。將樞紐最后的位置作為分界線,將數(shù)組分成兩部分(兩部分均不包含樞軸),這個過程稱作一趟快速排序。

一趟快速排序的具體做法

1.? 設(shè)兩個指針?low?和?high ,?他們的初始值分別為數(shù)組開始的下標(biāo) start,數(shù)組結(jié)束的下標(biāo)end

2.??樞軸值為?pivotKey

3.? ?則首先從?high?所指位置向前搜索,搜索到第一個小于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。

4.? 從?low?所指位置向后搜索,搜索到第一個大于?pivotKey?的?值,然后將這個值和??pivotKey?互相交換。

5.? 重復(fù)前兩步操作(3,4),直至?low ==?high 。

2.? Java?代碼實現(xiàn)

完全按照上面的思路的?Java?代碼如下:

package sort;/*** 快速排序(Quick Sort) Java代碼實現(xiàn)* 快排時間復(fù)雜度: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("排序前的數(shù)組: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的結(jié)果: ");PrintArray(arr, 0, arr.length-1);}/*** 對數(shù)組 arr 下標(biāo)從 start 到 end 的內(nèi)容進行排序* @param arr:待排序數(shù)組* @param start:開始的下標(biāo)* @param end:結(jié)束的下標(biāo)*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.? 設(shè)兩個指針?low?和?high ,他們的初始值分別為數(shù)組開始的下標(biāo) start,數(shù)組結(jié)束的下標(biāo)endint low = start;int high = end;// 2.??樞軸值為?pivotKeyint pivotKey = arr[start];// 5. 重復(fù)前兩步操作(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;}// 對 小于樞軸值的那部分?jǐn)?shù)組值 進行快排quickSort(arr, start, low-1);// 對 大于樞軸值的那部分?jǐn)?shù)組值 進行快排quickSort(arr, low+1, end);}/***輸出數(shù)組中的值* @param arr:數(shù)組* @param start:數(shù)組開始的下標(biāo)* @param end:數(shù)組結(jié)束的下標(biāo)*/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.? 簡單的優(yōu)化

進行一次數(shù)值交換,如 :temp1 = arr[low]; arr[low] = arr[high]; arr[high] = temp1,需要三次賦值,temp1 = arr[low]; arr[high] = temp1?這兩次賦值其實是多余的,因為?當(dāng)?low ==?high ,?也就是最終的位置?low ,就是樞軸值的位置,我們只需要在一次快排結(jié)束后將樞軸值放到?low?位置就可以了。Java源碼如下。

package sort;/*** 快速排序(Quick Sort) Java代碼實現(xiàn)* 快排時間復(fù)雜度: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("排序前的數(shù)組: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的結(jié)果: ");PrintArray(arr, 0, arr.length-1);}/*** 對數(shù)組 arr 下標(biāo)從 start 到 end 的內(nèi)容進行排序* @param arr:待排序數(shù)組* @param start:開始的下標(biāo)* @param end:結(jié)束的下標(biāo)*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.? 設(shè)兩個指針?low?和?high ,他們的初始值分別為數(shù)組開始的下標(biāo) start,數(shù)組結(jié)束的下標(biāo)endint low = start;int high = end;// 2.??樞軸值為?pivotKeyint pivotKey = arr[start];// 5. 重復(fù)前兩步操作(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];}// 一次快排結(jié)束后將樞軸值放到?low?位置arr[low] = pivotKey;// 對 小于樞軸值的那部分?jǐn)?shù)組值 進行快排quickSort(arr, start, low-1);// 對 大于樞軸值的那部分?jǐn)?shù)組值 進行快排quickSort(arr, low+1, end);}/***輸出數(shù)組中的值* @param arr:數(shù)組* @param start:數(shù)組開始的下標(biāo)* @param end:數(shù)組結(jié)束的下標(biāo)*/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.? 優(yōu)化措施

優(yōu)化最壞的情況:在選擇樞軸,取數(shù)組的第一個元素、中間的那個元素、最后一個元素的中位數(shù)作為樞軸。

優(yōu)化最好的情況:添加兩個?布爾類型 變量,如果?指針low?從低端向中間的移動過程中沒有交換記錄,則不需要對樞軸左部分的元素排序;如果?指針high?從高端向中間的移動過程中沒有交換記錄,則不需要對樞軸右部分的元素排序,這樣就可能達到n的時間復(fù)雜度。

5.? 參考文獻

數(shù)據(jù)結(jié)構(gòu) -? 嚴(yán)蔚敏、吳偉民 -? 清華大學(xué)出版社

總結(jié)

以上是生活随笔為你收集整理的快排Java代码实现(Quick Sort)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。