Java經(jīng)典排序算法之快速排序代碼實(shí)例
1.簡介
快速排序,快速排序(Quicksort)是對冒泡排序的一種改進(jìn)。它采用了分治法的策略,數(shù)據(jù)量越大,越能體現(xiàn)快排的速度。
快速排序的平均時(shí)間復(fù)雜度是O(nlogn), 空間復(fù)雜度是O(log2n),是不穩(wěn)定排序。
快速排序?qū)崿F(xiàn)的思想是:指通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序。
整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。
總的來說:
- 第一步、在數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù) (一般是最左邊的數(shù))。
- 第二步、定義兩個(gè)指針:一個(gè)從右往左移動(dòng),找到比基準(zhǔn)數(shù)小的停下 ;另一個(gè)指針從左往右移動(dòng),找到比基準(zhǔn)數(shù)大的停下,交換兩個(gè)指針對應(yīng)的數(shù)。
- 第三步、交換完成,繼續(xù)檢索,重復(fù)第二步。
- 第四步、當(dāng)兩個(gè)指針相遇,停止檢索,將基準(zhǔn)數(shù)和相遇位置元素交換。此時(shí),第一輪排序結(jié)束。這時(shí)候的數(shù)組特點(diǎn): 基準(zhǔn)數(shù)左邊都小于基準(zhǔn)數(shù), 基準(zhǔn)數(shù)右邊都大于基準(zhǔn)數(shù)
- 第五步、采用分治策略,按照上述步驟繼續(xù)排列基準(zhǔn)數(shù)左邊,右邊同理。
看文字理解可能有點(diǎn)云里霧里,接下來我們用圖來解釋下這個(gè)過程。
2.圖解步驟
1.假設(shè)這有個(gè)待排序數(shù)組。我們定義基準(zhǔn)數(shù)為5,定義兩個(gè)指針 i、j
2.j指針先從右往左移動(dòng),找到比基準(zhǔn)數(shù)小的,停下,然后i指針向右移動(dòng),找到比基準(zhǔn)數(shù)大的,停下,
3.找到了,停下。
4.交換兩個(gè)元素。
5.重復(fù)上述步驟,直到兩個(gè)指針相遇。
6.到這里,基準(zhǔn)數(shù)歸位了。你就會(huì)發(fā)現(xiàn),基準(zhǔn)數(shù)左邊的都小于基準(zhǔn)數(shù) ,基準(zhǔn)數(shù)右邊的都大于基準(zhǔn)數(shù)。
7.現(xiàn)在使用分治法策略,先排左邊,再排右邊,重復(fù)上面的步驟。
左邊完成:
同理。右邊也是。
最終,完成排序。
3.代碼實(shí)現(xiàn)
接下來,我們用java語言來實(shí)現(xiàn)一下這個(gè)過程吧。
package com.znzz.quicksort; //快速排序 import java.util.Arrays; public class QuickSort { public static void main(String[] args) { int[] arr = {1,3,65,7,4,6,2}; System.out.println(Arrays.toString(arr)); long start = System.currentTimeMillis(); //獲取系統(tǒng)當(dāng)前時(shí)間(ms) quickSort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); System.out.println(System.currentTimeMillis() - start); //計(jì)算程序所用時(shí)間(ms) } // 定義方法,用來快速排序 public static void quickSort(int[] arr, int left, int right){ //判斷,如果左邊大于右邊,不合法,直接return if (left > right){ return; } //定義變量保存基準(zhǔn)數(shù) int base = arr[left]; //定義變量i,指向最左邊 int i = left; //定義變量j,指向最右邊 int j = right; //開始檢索 while (i != j) { //由j從右往左檢索。檢索到比基準(zhǔn)數(shù)小的就停下,檢索到比基準(zhǔn)數(shù)小大的就據(jù)徐檢索 while (arr[j] >= base && i < j) { j--; //表示從右往左移動(dòng) } //i從左往右檢索 while (arr[i] <= base && i < j) { i++; //表示從左往右移動(dòng) } //到這,表示i、j都停下了,代表都找到了符合的元素,開始交換對應(yīng)元素。 swap(arr, i, j); } //到這,說明i = j,表示相遇了 //停止檢索,把基準(zhǔn)數(shù)和相遇位置的數(shù)交換。 arr[left] = arr[i]; arr[i] = base; //基準(zhǔn)數(shù)在這就歸位了,這樣,左邊的數(shù)都比它小,右邊的數(shù)都比他大 //現(xiàn)在開始排左邊。 quickSort(arr, left, i-1); //現(xiàn)在開始排右邊。 quickSort(arr, i+1, right); } public static void swap(int [] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
4.總結(jié)
快速排序是不穩(wěn)定的排序,它的時(shí)間復(fù)雜度是O(nlogn): 空間復(fù)雜度是:O(log2n),使用的思想是分治法策略。
到此這篇關(guān)于Java經(jīng)典排序算法之快速排序代碼實(shí)例的文章就介紹到這了,更多相關(guān)Java快速排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中區(qū)別.toString() ,(String),valueOf()方法
這篇文章主要介紹了Java中區(qū)別.toString() ,(String),valueOf()方法,需要的朋友可以參考下2017-01-01Java實(shí)現(xiàn)多對多網(wǎng)絡(luò)通訊的流程
這篇文章主要介紹了Java實(shí)現(xiàn)多對多網(wǎng)絡(luò)通訊的流程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Spring?Boot?如何通過ServletRequestHandledEvent事件實(shí)現(xiàn)接口請求的性能監(jiān)控
在Spring框架中,監(jiān)控接口請求的性能可以通過ServletRequestHandledEvent事件實(shí)現(xiàn),這篇文章給大家介紹Spring?Boot?如何通過ServletRequestHandledEvent事件實(shí)現(xiàn)接口請求的性能監(jiān)控,感興趣的朋友跟隨小編一起看看吧2024-08-08SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例
本文主要介紹了SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10