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

Java快速排序的實現(xiàn)詳細(xì)代碼及通俗解釋

 更新時間:2025年02月19日 09:22:54   作者:賣房賣車只為一心敲Java  
這篇文章主要介紹了Java快速排序?qū)崿F(xiàn)的相關(guān)資料,快速排序是一種高效的排序算法,通過選擇一個基準(zhǔn)值將數(shù)組分成兩部分,左邊的元素比基準(zhǔn)值小,右邊的元素比基準(zhǔn)值大,然后遞歸地對這兩部分進行排序,需要的朋友可以參考下

快速排序的基本概念:

快速排序的核心就是選擇一個基準(zhǔn)值,然后將數(shù)組分成兩部分:

  • 左邊:比基準(zhǔn)值小的元素。
  • 右邊:比基準(zhǔn)值大的元素。 然后遞歸地對左右兩部分繼續(xù)進行這個過程,直到每部分都排好序。

來,我們用現(xiàn)實生活中的例子來理解!

假設(shè)你在整理一堆數(shù)字卡片??,你想把這些卡片按從小到大的順序排列。快速排序就像是你站在桌子旁邊,對這些卡片進行一次大分揀??,然后不斷地把小卡片和大卡片分成左右兩邊,直到它們都排好位置。

舉個具體的例子:

你有這樣一堆數(shù)字:
[8, 3, 5, 1, 9, 6]

第一步:選一個基準(zhǔn)值(pivot)

我們從中間選一個數(shù)字作為基準(zhǔn)值,比如選擇 6 作為基準(zhǔn)。

第二步:分揀

  • 比6小的數(shù)字放到左邊,即:[3, 5, 1]
  • 比6大的數(shù)字放到右邊,即:[8, 9]
  • 基準(zhǔn)值6就放在中間。

現(xiàn)在我們有了這樣的分揀結(jié)果: 左邊:[3, 5, 1]中間:6右邊:[8, 9]

第三步:遞歸處理左邊和右邊

  • 對左邊的數(shù)組 [3, 5, 1] 再次進行快速排序

    • 選擇基準(zhǔn)值:3
    • 左邊:[1] (比3?。?/li>
    • 右邊:[5] (比3大)

    現(xiàn)在左邊排好了:[1, 3, 5]

  • 右邊的數(shù)組 [8, 9]

    • 這個部分已經(jīng)排好了,因為8比9小。

第四步:組合結(jié)果

現(xiàn)在我們把所有部分組合起來:

  • 左邊:[1, 3, 5]
  • 基準(zhǔn)值:6
  • 右邊:[8, 9]

最終得到的排序結(jié)果就是:
[1, 3, 5, 6, 8, 9]

簡單總結(jié)快速排序的步驟:

  • 選擇基準(zhǔn)值:選一個數(shù)字作為基準(zhǔn)值,通常選擇數(shù)組中的某個元素。
  • 分揀:把比基準(zhǔn)值小的放左邊,比基準(zhǔn)值大的放右邊。
  • 遞歸:對左邊和右邊的部分繼續(xù)進行相同的操作。
  • 組合結(jié)果:最終把排好序的部分拼在一起。

用生活中的例子來理解:

Imagine 你要整理一個大抽屜里的襪子??。你先挑出一只作為“基準(zhǔn)襪”,比如中等長度的,然后開始整理:

  • 比基準(zhǔn)襪短的放一邊(左邊)。
  • 比基準(zhǔn)襪長的放另一邊(右邊)。

接著你再分別整理兩邊的襪子,按照同樣的方式繼續(xù)分揀,直到所有的襪子都按長短排好順序!

快速排序的優(yōu)勢

快速排序的效率很高,因為它每次都將問題規(guī)模減半。通過把問題分解成小問題,它能快速解決排序問題。平均時間復(fù)雜度是 O(n log n),在大多數(shù)情況下比冒泡排序(時間復(fù)雜度 O(n²))要快得多。

快速排序的完整Java代碼:

public class QuickSortExample {

    // 快速排序的主方法,傳入數(shù)組、最小索引和最大索引
    public static void quickSort(int[] arr, int low, int high) {
        // 如果低索引小于高索引,說明數(shù)組還沒排序完
        if (low < high) {
            // 找到基準(zhǔn)元素的位置,并把數(shù)組分成兩部分
            int pivotIndex = partition(arr, low, high);
            
            // 遞歸地對基準(zhǔn)左邊部分進行快速排序
            quickSort(arr, low, pivotIndex - 1);
            // 遞歸地對基準(zhǔn)右邊部分進行快速排序
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    // 分區(qū)方法:選擇一個基準(zhǔn)值,把小于基準(zhǔn)的元素放在左邊,大于基準(zhǔn)的放在右邊
    private static int partition(int[] arr, int low, int high) {
        // 選擇最右邊的元素作為基準(zhǔn)
        int pivot = arr[high];
        
        // i是用來追蹤小于基準(zhǔn)值的元素的位置
        int i = low - 1; 

        // 遍歷數(shù)組,找到所有小于基準(zhǔn)值的元素
        for (int j = low; j < high; j++) {
            // 如果當(dāng)前元素小于或等于基準(zhǔn)值
            if (arr[j] <= pivot) {
                i++; // 增加i,準(zhǔn)備交換小元素的位置
                
                // 交換arr[i]和arr[j],把小元素放到前面
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        // 最后,把基準(zhǔn)值放到正確的位置(中間)
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        // 返回基準(zhǔn)值的正確位置
        return i + 1;
    }

    // 測試快速排序方法的主函數(shù)
    public static void main(String[] args) {
        // 定義一個需要排序的數(shù)組
        int[] arr = {8, 3, 5, 1, 9, 6};

        // 打印排序前的數(shù)組
        System.out.println("排序前的數(shù)組:");
        printArray(arr);

        // 調(diào)用快速排序方法,排序整個數(shù)組
        quickSort(arr, 0, arr.length - 1);

        // 打印排序后的數(shù)組
        System.out.println("排序后的數(shù)組:");
        printArray(arr);
    }

    // 輔助方法:打印數(shù)組中的所有元素
    private static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

代碼詳解:

  • quickSort 方法:這是快速排序的主方法。它接收一個數(shù)組、最小索引(low)和最大索引(high)。如果當(dāng)前子數(shù)組的大小大于1(low < high),它會找到基準(zhǔn)值的正確位置,然后遞歸地排序左右兩部分。
  • partition 方法:這個方法的作用是將數(shù)組分成兩部分
    • 左邊是比基準(zhǔn)值小或相等的元素。
    • 右邊是比基準(zhǔn)值大的元素。
      它返回的是基準(zhǔn)值最終所在的位置,這樣我們知道從哪里把數(shù)組一分為二。
  • printArray 方法:這個方法是一個輔助方法,用來打印數(shù)組內(nèi)容,方便我們查看排序前后的效果。

解釋這個例子的通俗版本:

  • 選基準(zhǔn)值
    比如我們從數(shù)組 [8, 3, 5, 1, 9, 6] 中選了 6 作為基準(zhǔn)值。這個基準(zhǔn)值就像是一條“分界線”,我們要把小于 6 的元素放到左邊,把大于 6 的元素放到右邊。
  • 分左右
    遍歷數(shù)組,依次將小于 6 的元素放在數(shù)組的前面,大于 6 的元素放到數(shù)組的后面。比如 35, 和 1 會被移到前面,89 會放到后面,6 作為基準(zhǔn)值就在中間。
  • 遞歸處理
    然后我們對左邊部分 [3, 5, 1] 和右邊部分 [8, 9] 繼續(xù)做相同的分揀,直到每個部分都只有一個元素為止。
  • 排序完成
    最后,所有的元素就按照從小到大的順序排好了,結(jié)果是 [1, 3, 5, 6, 8, 9]。

排序前的數(shù)組:
8 3 5 1 9 6 
排序后的數(shù)組:
1 3 5 6 8 9 

小結(jié):

  • 快速排序通過挑選一個基準(zhǔn)值,然后將數(shù)組分為兩部分:左邊比基準(zhǔn)小,右邊比基準(zhǔn)大。
  • 然后對左右兩部分繼續(xù)遞歸進行快速排序,直到數(shù)組排序完畢。
  • 整個過程其實就是不停地“分揀”元素,類似于你把大小不同的物品進行快速分揀,最后得到排序結(jié)果。

總結(jié) 

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

相關(guān)文章

  • maven項目切換JDK踩坑指南分享

    maven項目切換JDK踩坑指南分享

    文章介紹了如何在Windows系統(tǒng)中配置多版本JDK環(huán)境,并解決環(huán)境變量配置失效的問題,同時,還提供了在IntelliJ?IDEA中配置不同項目JDK版本的方法
    2024-11-11
  • 使用maven創(chuàng)建web項目的方法步驟(圖文)

    使用maven創(chuàng)建web項目的方法步驟(圖文)

    本篇文章主要介紹了使用maven創(chuàng)建web項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例

    java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例

    這篇文章主要介紹了java實現(xiàn)的日期時間轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下
    2019-10-10
  • java接口性能從20s優(yōu)化到500ms示例詳解

    java接口性能從20s優(yōu)化到500ms示例詳解

    這篇文章主要為大家介紹了java接口性能從20s優(yōu)化到500ms的操作技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • SpringBoot實現(xiàn)上傳文件到AWS S3的代碼

    SpringBoot實現(xiàn)上傳文件到AWS S3的代碼

    這篇文章主要介紹了SpringBoot實現(xiàn)上傳文件到AWS S3的代碼,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • java結(jié)束進程的實例代碼

    java結(jié)束進程的實例代碼

    java結(jié)束程序進程的方法很簡單,只要一句代碼就行,大家參考使用吧
    2013-12-12
  • java組件smartupload實現(xiàn)上傳文件功能

    java組件smartupload實現(xiàn)上傳文件功能

    這篇文章主要為大家詳細(xì)介紹了java組件smartupload實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • springboot項目中controller層與前端的參數(shù)傳遞方式

    springboot項目中controller層與前端的參數(shù)傳遞方式

    這篇文章主要介紹了springboot項目中controller層與前端的參數(shù)傳遞方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • StringBuilder為什么線程不安全深入講解

    StringBuilder為什么線程不安全深入講解

    這篇文章主要給大家介紹了關(guān)于StringBuilder為什么線程不安全的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用StringBuilder線程具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java下載https文件并上傳阿里云oss服務(wù)器

    Java下載https文件并上傳阿里云oss服務(wù)器

    這篇文章主要介紹了Java下載https文件并上傳到阿里云oss服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

健康| 灯塔市| 通山县| 芦山县| 茶陵县| 梅州市| 普兰县| 繁峙县| 长兴县| 调兵山市| 西乡县| 克拉玛依市| 天台县| 绍兴市| 兴隆县| 清涧县| 澄迈县| 建始县| 铜山县| 灵武市| 万源市| 青州市| 海兴县| 米易县| 长岭县| 务川| 潜江市| 容城县| 达州市| 大田县| 定西市| 资溪县| 改则县| 开原市| 南溪县| 泰顺县| 泽库县| 金坛市| 江北区| 淮滨县| 泾阳县|