欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

高快省的排序算法

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

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

3 1 2 5 4 6 9 7 10 8

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

排序算法顯神威

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

這里寫圖片描述 

首先哨兵j開始出動。因為此處設(shè)置的基準數(shù)是最左邊的數(shù),所以需要讓哨兵j先出動,這一點非常重要(請自己想一想為什么)。哨兵j一步一步地向左挪動(即j–),直到找到一個小于6的數(shù)停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數(shù)大于6的數(shù)停下來。最后哨兵j停在了數(shù)字5面前,哨兵i停在了數(shù)字7面前。 

這里寫圖片描述 

這里寫圖片描述 

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

6 1 2 5 9 3 4 7 10 8 

這里寫圖片描述 

這里寫圖片描述 

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

6 1 2 5 4 3 9 7 10 8

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

3 1 2 5 4 6 9 7 10 8

這里寫圖片描述 

這里寫圖片描述 

這里寫圖片描述

到此第一輪“探測”真正結(jié)束。此時以基準數(shù)6為分界點,6左邊的數(shù)都小于等于6,6右邊的數(shù)都大于等于6?;仡櫼幌聞偛诺倪^程,其實哨兵j的使命就是要找小于基準數(shù)的數(shù),而哨兵i的使命就是要找大于基準數(shù)的數(shù),直到i和j碰頭為止。

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

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

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

2 1 3 5 4

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

1 2 3 4 5 6 9 7 10 8

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

1 2 3 4 5 6 7 8 9 10

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

這里寫圖片描述

這是為什么呢?

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

代碼實現(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就是基準位
        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;
            }
 
        }
        //最后將基準為與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實現(xiàn)快速排序的文章就介紹到這了,更多相關(guān)JAVA快速排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

    淺談Java非阻塞同步機制和CAS

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

    Springboot項目啟動找不到啟動類的解決

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

    解讀@ConfigurationProperties的基本用法

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

    詳解SpringCloud使用Consul做注冊中心

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

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

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

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

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

    Java AtomicInteger類使用方法實例講解

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

最新評論