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

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

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

1.快速排序簡介

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

2.思路簡介及圖解

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

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

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

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

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

光看思路簡介其實還不是很好理解,下面來舉例說明

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

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

思路圖解:

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

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

1.紅色塊標識基準數(shù),left、right初始位置如圖所示:

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

3.此時left開始移動,不斷向右移動,尋找比基準數(shù)大的數(shù),找到了8,這時,left、right都找到了對應的數(shù),進行交換:

4.right繼續(xù)向左尋找比基準數(shù)6小的數(shù),找到后,left繼續(xù)向右尋找比基準數(shù)大的數(shù),當left與right都找到對應的數(shù)后,再次進行交換。

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

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

3.實現(xià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;
        }

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    spark中使用groupByKey進行分組排序的示例代碼

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

    Java synchronized的鎖升級過程詳解

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

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

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

最新評論

惠安县| 拜泉县| 乌拉特中旗| 炉霍县| 武威市| 汤原县| 徐汇区| 巴彦淖尔市| 西青区| 甘泉县| 商都县| 那坡县| 萨迦县| 阜新| 怀仁县| 美姑县| 石城县| 遵义市| 广宗县| 周至县| 乌兰浩特市| 天镇县| 钟祥市| 连平县| 唐海县| 汽车| 新巴尔虎右旗| 宁夏| 洪泽县| 河北省| 高台县| 滁州市| 宝山区| 内黄县| 阳山县| 延吉市| 汕头市| 大同市| 元朗区| 乌兰县| 江西省|