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

圖解Java排序算法之快速排序的三數(shù)取中法

 更新時(shí)間:2021年11月04日 15:26:02   作者:dreamcatcher-cx  
這篇文章主要為大家詳細(xì)介紹了Java排序算法之快速排序的三數(shù)取中法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

基本步驟

三數(shù)取中

在快排的過(guò)程中,每一次我們要取一個(gè)元素作為樞紐值,以這個(gè)數(shù)字來(lái)將序列劃分為兩部分。在此我們采用三數(shù)取中法,也就是取左端、中間、右端三個(gè)數(shù),然后進(jìn)行排序,將中間數(shù)作為樞紐值。

根據(jù)樞紐值進(jìn)行分割

 

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

package sortdemo;
import java.util.Arrays;
/**
 * Created by chengxiao on 2016/12/14.
 * 快速排序
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序結(jié)果:" + Arrays.toString(arr));
    }
    /**
     * @param arr
     * @param left  左指針
     * @param right 右指針
     */
    public static void quickSort(int[] arr, int left, int right) {
        if (left < right) {
            //獲取樞紐值,并將其放在當(dāng)前待處理序列末尾
            dealPivot(arr, left, right);
            //樞紐值被放在序列末尾
            int pivot = right - 1;
            //左指針
            int i = left;
            //右指針
            int j = right - 1;
            while (true) {
                while (arr[++i] < arr[pivot]) {
                }
                while (j > left && arr[--j] > arr[pivot]) {
                }
                if (i < j) {
                    swap(arr, i, j);
                } else {
                    break;
                }
            }
            if (i < right) {
                swap(arr, i, right - 1);
            }
            quickSort(arr, left, i - 1);
            quickSort(arr, i + 1, right);
        }
    }
    /**
     * 處理樞紐值
     *
     * @param arr
     * @param left
     * @param right
     */
    public static void dealPivot(int[] arr, int left, int right) {
        int mid = (left + right) / 2;
        if (arr[left] > arr[mid]) {
            swap(arr, left, mid);
        }
        if (arr[left] > arr[right]) {
            swap(arr, left, right);
        }
        if (arr[right] < arr[mid]) {
            swap(arr, right, mid);
        }
        swap(arr, right - 1, mid);
    }
    /**
     * 交換元素通用處理
     *
     * @param arr
     * @param a
     * @param b
     */
    private static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

排序結(jié)果

[1, 2, 3, 4, 5, 6, 7, 8]

總結(jié)

快速排序是一種交換類(lèi)的排序,它同樣是分治法的經(jīng)典體現(xiàn)。在一趟排序中將待排序的序列分割成兩組,其中一部分記錄的關(guān)鍵字均小于另一部分。然后分別對(duì)這兩組繼續(xù)進(jìn)行排序,以使整個(gè)序列有序。在分割的過(guò)程中,樞紐值的選擇至關(guān)重要,本文采取了三位取中法,可以很大程度上避免分組"一邊倒"的情況。快速排序平均時(shí)間復(fù)雜度也為O(nlogn)級(jí)。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 簡(jiǎn)單談?wù)刯ava中匿名內(nèi)部類(lèi)構(gòu)造函數(shù)

    簡(jiǎn)單談?wù)刯ava中匿名內(nèi)部類(lèi)構(gòu)造函數(shù)

    這篇文章主要簡(jiǎn)單給我們介紹了java中匿名內(nèi)部類(lèi)構(gòu)造函數(shù),并附上了簡(jiǎn)單的示例,有需要的小伙伴可以參考下。
    2015-11-11
  • SpringBoot使用Maven打包異常-引入外部jar的問(wèn)題及解決方案

    SpringBoot使用Maven打包異常-引入外部jar的問(wèn)題及解決方案

    這篇文章主要介紹了SpringBoot使用Maven打包異常-引入外部jar,需要的朋友可以參考下
    2020-06-06
  • SpringBoot +Vue開(kāi)發(fā)考試系統(tǒng)的教程

    SpringBoot +Vue開(kāi)發(fā)考試系統(tǒng)的教程

    這篇文章主要介紹了SpringBoot +Vue開(kāi)發(fā)考試系統(tǒng),支持多種題型:選擇題、多選題、判斷題、填空題、綜合題以及數(shù)學(xué)公式。支持在線考試,教師在線批改試卷。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-05-05
  • 使用React和springboot做前后端分離項(xiàng)目的步驟方式

    使用React和springboot做前后端分離項(xiàng)目的步驟方式

    這篇文章主要介紹了使用React和springboot做前后端分離項(xiàng)目的步驟方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Kotlin中常見(jiàn)的List使用示例教程

    Kotlin中常見(jiàn)的List使用示例教程

    filter 就像其本意一樣,可以通過(guò) filter 對(duì) Kotlin list 進(jìn)行過(guò)濾,本文重點(diǎn)給大家介紹Kotlin中常見(jiàn)的List使用,感興趣的朋友一起看看吧
    2023-11-11
  • Spring?Boot?集成接口管理工具?Knife4j

    Spring?Boot?集成接口管理工具?Knife4j

    這篇文章主要介紹了Spring?Boot?集成接口管理工具?Knife4j,首先通過(guò)創(chuàng)建一個(gè)?Spring?Boot?項(xiàng)目展開(kāi)主題,需要的小伙伴可以參考一下
    2022-05-05
  • Java排序算法之選擇排序

    Java排序算法之選擇排序

    這篇文章主要介紹了Java排序算法之選擇排序,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java Map集合詳解與演示

    Java Map集合詳解與演示

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的ley,另一組保存著Map的value,可以理解為Map中的元素是兩個(gè)對(duì)象,一個(gè)對(duì)象作為鍵,一個(gè)對(duì)象作為值。鍵不可以重復(fù),但是值可以重復(fù)
    2021-11-11
  • idea一鍵部署SpringBoot項(xiàng)目jar包到服務(wù)器的實(shí)現(xiàn)

    idea一鍵部署SpringBoot項(xiàng)目jar包到服務(wù)器的實(shí)現(xiàn)

    我們?cè)陂_(kāi)發(fā)環(huán)境部署項(xiàng)目一般通過(guò)idea將項(xiàng)目打包成jar包,然后連接linux服務(wù)器,將jar手動(dòng)上傳到服務(wù)中,本文就來(lái)詳細(xì)的介紹一下步驟,感興趣的可以了解一下
    2023-12-12
  • Nacos進(jìn)程自動(dòng)消失的原因分析

    Nacos進(jìn)程自動(dòng)消失的原因分析

    當(dāng)使用低版本Nacos時(shí),啟動(dòng)后關(guān)閉窗口或執(zhí)行control+c會(huì)導(dǎo)致Nacos服務(wù)自動(dòng)退出,原因是Nacos并未作為后臺(tái)進(jìn)程運(yùn)行,解決方法是在啟動(dòng)Nacos時(shí),采用后臺(tái)進(jìn)程方式啟動(dòng),這樣即使關(guān)閉窗口,Nacos服務(wù)也不會(huì)退出,從而保證服務(wù)的持續(xù)運(yùn)行
    2023-02-02

最新評(píng)論

徐州市| 青岛市| 乐陵市| 汤原县| 南川市| 平遥县| 肇州县| 武城县| 钟祥市| 许昌市| 眉山市| 阿克苏市| 浦江县| 文成县| 丹东市| 西青区| 沂源县| 奈曼旗| 莒南县| 大丰市| 武强县| 乐清市| 德惠市| 天祝| 河东区| 二手房| 泰来县| 藁城市| 昭觉县| 连州市| 肇源县| 望谟县| 新巴尔虎左旗| 无极县| 贵港市| 怀仁县| 南溪县| 平邑县| 津南区| 刚察县| 长乐市|