最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

排序算法圖解之Java快速排序的分步刨析

 更新時(shí)間:2022年11月09日 08:28:19   作者:興趣使然黃小黃  
快速排序是通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割為獨(dú)立的兩個(gè)部分,一部分的所有數(shù)據(jù)比另外一部分的所有數(shù)據(jù)要小,然后按照此方法對(duì)這兩部分分別進(jìn)行快速排序,整個(gè)過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。本文通過示例講解了快速排序的實(shí)現(xiàn),需要的可以參考一下

1.快速排序簡(jiǎn)介

快速排序是對(duì)冒泡排序的一種改進(jìn)?;舅枷霝椋和ㄟ^一趟排序?qū)⒁判虻臄?shù)據(jù)分割為獨(dú)立的兩個(gè)部分,其中一部分的所有數(shù)據(jù)比另外一部分的所有數(shù)據(jù)要小,然后按照此方法對(duì)這兩部分分別進(jìn)行快速排序,整個(gè)過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

2.思路簡(jiǎn)介及圖解

快速排序算法通過多次比較和交換來實(shí)現(xiàn)排序,其排序流程如下:

(1)首先設(shè)定一個(gè)分界值,通過該分界值將數(shù)組分成左右兩部分。

(2)將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊。此時(shí),左邊部分中各元素都小于分界值,而右邊部分中各元素都大于或等于分界值。

(3)然后,左邊和右邊的數(shù)據(jù)可以獨(dú)立排序。對(duì)于左側(cè)的數(shù)組數(shù)據(jù),又可以取一個(gè)分界值,將該部分?jǐn)?shù)據(jù)分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側(cè)的數(shù)組數(shù)據(jù)也可以做類似處理。

(4)重復(fù)上述過程,可以看出,這是一個(gè)遞歸定義。通過遞歸將左側(cè)部分排好序后,再遞歸排好右側(cè)部分的順序。當(dāng)左、右兩個(gè)部分各數(shù)據(jù)排序完成后,整個(gè)數(shù)組的排序也就完成了。

光看思路簡(jiǎn)介其實(shí)還不是很好理解,下面來舉例說明

一般情況下,我們會(huì)把數(shù)組中的一個(gè)數(shù)當(dāng)作基準(zhǔn)數(shù)(方便起見,會(huì)將數(shù)組最左邊的當(dāng)作基準(zhǔn)數(shù)),然后從兩邊進(jìn)行檢索。按照如下步驟進(jìn)行:

  • 先從右邊檢索比基準(zhǔn)數(shù)小的
  • 再從左邊檢索比基準(zhǔn)數(shù)大的
  • 一旦檢索到,就停下,并將檢索到的兩個(gè)元素進(jìn)行交換
  • 重復(fù)上述步驟,直到檢索相遇,則替換基準(zhǔn)數(shù),并更新區(qū)間,遞歸進(jìn)行
  • 最終序列會(huì)變得有序

思路圖解:

該圖出自網(wǎng)絡(luò),方便起見就以序列:{6,1,8,0,0,9,5,3,7} 為例子

具體分析一下第一趟排序:以6為基準(zhǔn)數(shù)的步驟

1.紅色塊標(biāo)識(shí)基準(zhǔn)數(shù),left、right初始位置如圖所示:

2.right不斷向左移動(dòng),尋找比基準(zhǔn)數(shù)小的數(shù),如圖所示,找到了3

3.此時(shí)left開始移動(dòng),不斷向右移動(dòng),尋找比基準(zhǔn)數(shù)大的數(shù),找到了8,這時(shí),left、right都找到了對(duì)應(yīng)的數(shù),進(jìn)行交換:

4.right繼續(xù)向左尋找比基準(zhǔn)數(shù)6小的數(shù),找到后,left繼續(xù)向右尋找比基準(zhǔn)數(shù)大的數(shù),當(dāng)left與right都找到對(duì)應(yīng)的數(shù)后,再次進(jìn)行交換。

5.重復(fù)上述步驟,right繼續(xù)向左走,但是此時(shí),left與right相遇,指向了5的位置,則將基準(zhǔn)數(shù)與該位置的數(shù)進(jìn)行交換,這樣就可以觀察到,6的左邊都是比6小的,右邊都是比6大的。

6.該過程需要遞歸進(jìn)行,直到序列有序。即以5為基準(zhǔn)數(shù),遞歸6左邊的區(qū)間,再遞歸右邊的,反復(fù)進(jìn)行,直到left >right退出。

3.實(shí)現(xiàn)代碼及運(yùn)行結(jié)果

import java.util.Arrays;

/**
 * @author 興趣使然黃小黃
 * @version 1.0
 * 快速排序
 */
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {6,1,8,0,0,9,5,3,7};
        quickSort(arr, 0, arr.length-1);
        System.out.println("排序后: " + Arrays.toString(arr));
    }

    //快速排序
    public static void quickSort(int[] arr, int left, int right) {
        //邊界條件
        if (left > right){
            return;
        }

        //定義基準(zhǔn)數(shù)和左右指針
        int l = left;
        int r = right;
        int base = arr[left];

        //循環(huán),將比基準(zhǔn)數(shù)小的放在左邊,比基準(zhǔn)數(shù)大的放在右邊
        while (l != r){
            //先從右邊找比基準(zhǔn)數(shù)小的,停下
            while (arr[r] >= base && l < r){
                r--;
            }
            //從左邊找比基準(zhǔn)數(shù)大的,停下
            while (arr[l] <= base && l < r){
                l++;
            }
            //此時(shí)已經(jīng)找到對(duì)應(yīng)的l 和 r,進(jìn)行交換
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
        }
        //至此,基準(zhǔn)數(shù)兩邊都按照需要排好了,只需要將基準(zhǔn)數(shù)與lr相遇的位置進(jìn)行交換
        arr[left] = arr[l];
        arr[l] = base;
        //打印中間結(jié)果
        System.out.println(Arrays.toString(arr));
        //先向左找
        quickSort(arr, left, r-1);
        //向右遞歸
        quickSort(arr, l+1, right);
    }
}

實(shí)現(xiàn)結(jié)果:

到此這篇關(guān)于排序算法圖解之Java快速排序的分步刨析的文章就介紹到這了,更多相關(guān)Java快速排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb入門教程之分頁查詢功能的簡(jiǎn)單實(shí)現(xiàn)

    JavaWeb入門教程之分頁查詢功能的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了JavaWeb入門教程之分頁查詢功能的簡(jiǎn)單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • javaCV視頻處理之提取人像視頻

    javaCV視頻處理之提取人像視頻

    這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)提取視頻中的人像并保存為視頻,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaCV有一定的幫助,需要的可以參考一下
    2021-12-12
  • 如何通過Java實(shí)現(xiàn)PDF轉(zhuǎn)高質(zhì)量圖片

    如何通過Java實(shí)現(xiàn)PDF轉(zhuǎn)高質(zhì)量圖片

    在Java中,將PDF文件轉(zhuǎn)換為高質(zhì)量的圖片可以使用不同的庫,其中最常用的庫之一是?Apache?PDFBox,下面我們就來看看這個(gè)庫的具體使用吧
    2024-10-10
  • Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    這篇文章主要介紹了Netty結(jié)合Protobuf進(jìn)行編解碼,通過文檔表述和代碼實(shí)例充分說明了如何進(jìn)行使用和操作,需要的朋友可以參考下
    2021-06-06
  • MyBatis實(shí)現(xiàn)配置加載的步驟

    MyBatis實(shí)現(xiàn)配置加載的步驟

    本文主要介紹了MyBatis實(shí)現(xiàn)配置加載的步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java連接sql server 2008數(shù)據(jù)庫代碼

    java連接sql server 2008數(shù)據(jù)庫代碼

    Java的學(xué)習(xí),很重要的一點(diǎn)是對(duì)數(shù)據(jù)庫進(jìn)行操作。
    2013-03-03
  • 在CentOS上配置Java環(huán)境變量的教程

    在CentOS上配置Java環(huán)境變量的教程

    這篇文章主要介紹了在CentOS上配置Java環(huán)境變量的教程,同時(shí)適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • spark中使用groupByKey進(jìn)行分組排序的示例代碼

    spark中使用groupByKey進(jìn)行分組排序的示例代碼

    這篇文章主要介紹了spark中使用groupByKey進(jìn)行分組排序的實(shí)例代碼,本文通過實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java synchronized的鎖升級(jí)過程詳解

    Java synchronized的鎖升級(jí)過程詳解

    在 JDK 1.6之前,synchronized 是一個(gè)重量級(jí)、效率比較低下的鎖,但是在JDK 1.6后,JVM 為了提高鎖的獲取與釋放效,,對(duì) synchronized 進(jìn)行了優(yōu)化,所以本文給大家介紹了synchronized的鎖升級(jí)過程,需要的朋友可以參考下
    2024-04-04
  • 基于Springboot實(shí)現(xiàn)定時(shí)發(fā)送郵件功能

    基于Springboot實(shí)現(xiàn)定時(shí)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了基于Springboot實(shí)現(xiàn)定時(shí)發(fā)送郵件功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論

镇宁| 即墨市| 赣州市| 澄迈县| 中西区| 锦屏县| 淳化县| 自贡市| 蓬溪县| 闽侯县| 黄大仙区| 都兰县| 微山县| 新巴尔虎右旗| 永寿县| 祁门县| 眉山市| 本溪市| 资源县| 天气| 红安县| 华阴市| 浦东新区| 谢通门县| 保康县| 隆子县| 交口县| 射洪县| 扎囊县| 乐都县| 平邑县| 化州市| 梁平县| 望谟县| 敖汉旗| 富裕县| 将乐县| 淮北市| 青州市| 沛县| 彩票|