亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

圖文詳解JAVA實(shí)現(xiàn)快速排序

 更新時(shí)間:2021年05月08日 09:25:21   作者:一顆西瓜  
這篇文章主要給大家介紹了關(guān)于JAVA實(shí)現(xiàn)快速排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

高快省的排序算法

有沒有既不浪費(fèi)空間又可以快一點(diǎn)的排序算法呢?那就是“快速排序”啦!光聽這個(gè)名字是不是就覺得很高端呢。

假設(shè)我們現(xiàn)在對(duì)“6 1 2 7 9 3 4 5 10 8”這個(gè)10個(gè)數(shù)進(jìn)行排序。首先在這個(gè)序列中隨便找一個(gè)數(shù)作為基準(zhǔn)數(shù)(不要被這個(gè)名詞嚇到了,就是一個(gè)用來(lái)參照的數(shù),待會(huì)你就知道它用來(lái)做啥的了)。為了方便,就讓第一個(gè)數(shù)6作為基準(zhǔn)數(shù)吧。接下來(lái),需要將這個(gè)序列中所有比基準(zhǔn)數(shù)大的數(shù)放在6的右邊,比基準(zhǔn)數(shù)小的數(shù)放在6的左邊,類似下面這種排列:

3 1 2 5 4 6 9 7 10 8

在初始狀態(tài)下,數(shù)字6在序列的第1位。我們的目標(biāo)是將6挪到序列中間的某個(gè)位置,假設(shè)這個(gè)位置是k?,F(xiàn)在就需要尋找這個(gè)k,并且以第k位為分界點(diǎn),左邊的數(shù)都小于等于6,右邊的數(shù)都大于等于6。想一想,你有辦法可以做到這點(diǎn)嗎?

排序算法顯神威

方法其實(shí)很簡(jiǎn)單:分別從初始序列“6 1 2 7 9 3 4 5 10 8”兩端開始“探測(cè)”。先從右往左找一個(gè)小于6的數(shù),再?gòu)淖笸艺乙粋€(gè)大于6的數(shù),然后交換他們。這里可以用兩個(gè)變量i和j,分別指向序列最左邊和最右邊。我們?yōu)檫@兩個(gè)變量起個(gè)好聽的名字“哨兵i”和“哨兵j”。剛開始的時(shí)候讓哨兵i指向序列的最左邊(即i=1),指向數(shù)字6。讓哨兵j指向序列的最右邊(即=10),指向數(shù)字。

這里寫圖片描述 

首先哨兵j開始出動(dòng)。因?yàn)榇颂幵O(shè)置的基準(zhǔn)數(shù)是最左邊的數(shù),所以需要讓哨兵j先出動(dòng),這一點(diǎn)非常重要(請(qǐng)自己想一想為什么)。哨兵j一步一步地向左挪動(dòng)(即j–),直到找到一個(gè)小于6的數(shù)停下來(lái)。接下來(lái)哨兵i再一步一步向右挪動(dòng)(即i++),直到找到一個(gè)數(shù)大于6的數(shù)停下來(lái)。最后哨兵j停在了數(shù)字5面前,哨兵i停在了數(shù)字7面前。 

這里寫圖片描述 

這里寫圖片描述 

現(xiàn)在交換哨兵i和哨兵j所指向的元素的值。交換之后的序列如下:

6 1 2 5 9 3 4 7 10 8 

這里寫圖片描述 

這里寫圖片描述 

到此,第一次交換結(jié)束。接下來(lái)開始哨兵j繼續(xù)向左挪動(dòng)(再友情提醒,每次必須是哨兵j先出發(fā))。他發(fā)現(xiàn)了4(比基準(zhǔn)數(shù)6要小,滿足要求)之后停了下來(lái)。哨兵i也繼續(xù)向右挪動(dòng)的,他發(fā)現(xiàn)了9(比基準(zhǔn)數(shù)6要大,滿足要求)之后停了下來(lái)。此時(shí)再次進(jìn)行交換,交換之后的序列如下:

6 1 2 5 4 3 9 7 10 8

第二次交換結(jié)束,“探測(cè)”繼續(xù)。哨兵j繼續(xù)向左挪動(dòng),他發(fā)現(xiàn)了3(比基準(zhǔn)數(shù)6要小,滿足要求)之后又停了下來(lái)。哨兵i繼續(xù)向右移動(dòng),糟啦!此時(shí)哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。說(shuō)明此時(shí)“探測(cè)”結(jié)束。我們將基準(zhǔn)數(shù)6和3進(jìn)行交換。交換之后的序列如下:

3 1 2 5 4 6 9 7 10 8

這里寫圖片描述 

這里寫圖片描述 

這里寫圖片描述

到此第一輪“探測(cè)”真正結(jié)束。此時(shí)以基準(zhǔn)數(shù)6為分界點(diǎn),6左邊的數(shù)都小于等于6,6右邊的數(shù)都大于等于6。回顧一下剛才的過程,其實(shí)哨兵j的使命就是要找小于基準(zhǔn)數(shù)的數(shù),而哨兵i的使命就是要找大于基準(zhǔn)數(shù)的數(shù),直到i和j碰頭為止。

OK,解釋完畢?,F(xiàn)在基準(zhǔn)數(shù)6已經(jīng)歸位,它正好處在序列的第6位。此時(shí)我們已經(jīng)將原來(lái)的序列,以6為分界點(diǎn)拆分成了兩個(gè)序列,左邊的序列是“3 1 2 5 4”,右邊的序列是“9 7 10 8”。接下來(lái)還需要分別處理這兩個(gè)序列。因?yàn)?左邊和右邊的序列目前都還是很混亂的。不過不要緊,我們已經(jīng)掌握了方法,接下來(lái)只要模擬剛才的方法分別處理6左邊和右邊的序列即可?,F(xiàn)在先來(lái)處理6左邊的序列現(xiàn)吧。

左邊的序列是“3 1 2 5 4”。請(qǐng)將這個(gè)序列以3為基準(zhǔn)數(shù)進(jìn)行調(diào)整,使得3左邊的數(shù)都小于等于3,3右邊的數(shù)都大于等于3。好了開始動(dòng)筆吧

如果你模擬的沒有錯(cuò),調(diào)整完畢之后的序列的順序應(yīng)該是:

2 1 3 5 4

OK,現(xiàn)在3已經(jīng)歸位。接下來(lái)需要處理3左邊的序列“2 1”和右邊的序列“5 4”。對(duì)序列“2 1”以2為基準(zhǔn)數(shù)進(jìn)行調(diào)整,處理完畢之后的序列為“1 2”,到此2已經(jīng)歸位。序列“1”只有一個(gè)數(shù),也不需要進(jìn)行任何處理。至此我們對(duì)序列“2 1”已全部處理完畢,得到序列是“1 2”。序列“5 4”的處理也仿照此方法,最后得到的序列如下:

1 2 3 4 5 6 9 7 10 8

對(duì)于序列“9 7 10 8”也模擬剛才的過程,直到不可拆分出新的子序列為止。最終將會(huì)得到這樣的序列,如下

1 2 3 4 5 6 7 8 9 10

到此,排序完全結(jié)束。細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn),快速排序的每一輪處理其實(shí)就是將這一輪的基準(zhǔn)數(shù)歸位,直到所有的數(shù)都?xì)w位為止,排序就結(jié)束了。下面上個(gè)霸氣的圖來(lái)描述下整個(gè)算法的處理過程。 

這里寫圖片描述

這是為什么呢?

快速排序之所比較快,因?yàn)橄啾让芭菖判颍看谓粨Q是跳躍式的。每次排序的時(shí)候設(shè)置一個(gè)基準(zhǔn)點(diǎn),將小于等于基準(zhǔn)點(diǎn)的數(shù)全部放到基準(zhǔn)點(diǎn)的左邊,將大于等于基準(zhǔn)點(diǎn)的數(shù)全部放到基準(zhǔn)點(diǎn)的右邊。這樣在每次交換的時(shí)候就不會(huì)像冒泡排序一樣每次只能在相鄰的數(shù)之間進(jìn)行交換,交換的距離就大的多了。因此總的比較和交換次數(shù)就少了,速度自然就提高了。當(dāng)然在最壞的情況下,仍可能是相鄰的兩個(gè)數(shù)進(jìn)行了交換。因此快速排序的最差時(shí)間復(fù)雜度和冒泡排序是一樣的都是O(N2),它的平均時(shí)間復(fù)雜度為O(NlogN)。其實(shí)快速排序是基于一種叫做“二分”的思想。我們后面還會(huì)遇到“二分”思想,到時(shí)候再聊。先上代碼,如下

代碼實(shí)現(xiàn):

public class QuickSort {
    public static void quickSort(int[] arr,int low,int high){
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        //temp就是基準(zhǔn)位
        temp = arr[low];
 
        while (i<j) {
            //先看右邊,依次往左遞減
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            //再看左邊,依次往右遞增
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            //如果滿足條件則交換
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }
 
        }
        //最后將基準(zhǔn)為與i和j相等位置的數(shù)字交換
         arr[low] = arr[i];
         arr[i] = temp;
        //遞歸調(diào)用左半數(shù)組
        quickSort(arr, low, j-1);
        //遞歸調(diào)用右半數(shù)組
        quickSort(arr, j+1, high);
    }
 
 
    public static void main(String[] args){
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        quickSort(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

輸出為
1
2
2
3
4
4
7
7
8
9
10
19
62

總結(jié)

到此這篇關(guān)于JAVA實(shí)現(xiàn)快速排序的文章就介紹到這了,更多相關(guān)JAVA快速排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))

    SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))

    這篇文章主要介紹了SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)(自定義校驗(yàn),分組校驗(yàn))的實(shí)戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-07-07
  • Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實(shí)現(xiàn)方法

    Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實(shí)現(xiàn)方法

    spring cloud用上了配置中心,就一個(gè)boostrap.yml,本文就來(lái)介紹一下Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2024-03-03
  • SpringBoot實(shí)現(xiàn)PDF添加水印的示例

    SpringBoot實(shí)現(xiàn)PDF添加水印的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)PDF添加水印的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 淺談Java非阻塞同步機(jī)制和CAS

    淺談Java非阻塞同步機(jī)制和CAS

    我們知道在java 5之前同步是通過Synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)的,在java 5之后,java.util.concurrent包里面添加了很多性能更加強(qiáng)大的同步類。這些強(qiáng)大的類中很多都實(shí)現(xiàn)了非阻塞的同步機(jī)制從而幫助其提升性能。
    2021-06-06
  • Springboot項(xiàng)目啟動(dòng)找不到啟動(dòng)類的解決

    Springboot項(xiàng)目啟動(dòng)找不到啟動(dòng)類的解決

    這篇文章主要介紹了Springboot項(xiàng)目啟動(dòng)找不到啟動(dòng)類的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 解讀@ConfigurationProperties的基本用法

    解讀@ConfigurationProperties的基本用法

    這篇文章主要介紹了@ConfigurationProperties的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 詳解SpringCloud使用Consul做注冊(cè)中心

    詳解SpringCloud使用Consul做注冊(cè)中心

    這篇文章主要介紹了SpringCloud使用Consul做注冊(cè)中心,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • VSCode?配置?Spring?Boot?項(xiàng)目開發(fā)環(huán)境的全過程

    VSCode?配置?Spring?Boot?項(xiàng)目開發(fā)環(huán)境的全過程

    兩三年前曾經(jīng)試過配置Java環(huán)境, 存在不少問題作罷. 最近搜了下相關(guān)的文章, 感覺VSCode對(duì)Java項(xiàng)目的支持比三年前完善了不少. 今天實(shí)際配置了一下環(huán)境, 把自己常用的功能過了一遍, 基本能跑通開發(fā)流程, 做個(gè)筆記,需要的朋友可以參考下
    2024-03-03
  • Spring Boot 如何解決富文本上傳圖片跨域問題

    Spring Boot 如何解決富文本上傳圖片跨域問題

    這篇文章主要介紹了Spring Boot 如何解決富文本上傳圖片跨域問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java AtomicInteger類使用方法實(shí)例講解

    Java AtomicInteger類使用方法實(shí)例講解

    這篇文章主要介紹了Java AtomicInteger類使用方法實(shí)例講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論