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

Java輕松入門(mén)冒泡?選擇?插入?希爾?歸并排序算法

 更新時(shí)間:2022年02月12日 16:30:51   作者:爪哇貢塵拾Miraitow  
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開(kāi)發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java常見(jiàn)的排序算法,需要的朋友可以參考一下

今天我們主要看一些簡(jiǎn)單的排序

常見(jiàn)的時(shí)間復(fù)雜度

?? 常數(shù)階Ο(1)

?? 對(duì)數(shù)階Ο(log2n)

?? 線性階Ο(n)

?? 線性對(duì)數(shù)階Ο(nlog2n)

?? 平方階Ο(n²)

?? 立方階Ο(n³)

?? K次方階Ο(n^k)

?? 指數(shù)階Ο(2^n)

常見(jiàn)的時(shí)間復(fù)雜度對(duì)應(yīng)圖

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n²)<Ο(n³)<…<Ο(2^n) <Ο(n!)<O(n^n)

冒泡排序(Quicksort)

算法描述:

①. 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。

②. 對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。

③. 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。

④. 持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟①~③,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

為了直觀感受,在網(wǎng)上找個(gè)動(dòng)態(tài)的演示

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

當(dāng)數(shù)組中有n個(gè)元素時(shí),只需要進(jìn)行n-1輪比較,則整個(gè)數(shù)組就是有序的
public static void bubbleSort(int[] arr) {
 // 進(jìn)行i輪比較
    for (int i = 0; i < arr.length - 1; i++)
     {
        for (int j = 0; j < arr.length - 1 - i; j++) {
        //后一位的值大于前一位的值進(jìn)行值交換
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
        }
    }
}

public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

選擇排序(Quicksort)

算法描述:

選擇排序是一種簡(jiǎn)單直觀的排序算法。它的工作原理是:第一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,存放在序列的起始位置,然后再?gòu)氖S嗟奈磁判蛟刂袑ふ业阶钚。ù螅┰?,繼續(xù)放在起始位置知道未排序元素個(gè)數(shù)為0。

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

public static void selectionSort(int[] a) {
//每當(dāng)完成一輪,將會(huì)找到最小值,一個(gè)i代表一輪
    for (int i = 0; i < a.length; i++) {
        int index = i;
        //每一輪從i+1開(kāi)始找,查找是否有比當(dāng)前值更小的值
        for (int j = i + 1; j < a.length; j++) {
            if (a[index] > a[j]) {
                index = j;
            }
        }//如果index和i不相等說(shuō)明,下標(biāo)交換過(guò),也就是說(shuō)找到更小的數(shù)值了
        if (index != i) {
            swap(a, index, i);
        }
    }
}

public static void swap(int[] a, int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

插入排序(insertSort)

算法描述:

插入排序也是一種常見(jiàn)的排序算法,插入排序的思想是:將初始數(shù)據(jù)分為有序部分和無(wú)序部分,每一步將一個(gè)無(wú)序部分的數(shù)據(jù)插入到前面已經(jīng)排好序的有序部分中,直到插完所有元素為止。 插入排序的步驟如下:每次從無(wú)序部分中取出一個(gè)元素,與有序部分中的元素從后向前依次進(jìn)行比較,并找到合適的位置,將該元素插到有序組當(dāng)中。 將數(shù)組分為2端,有序數(shù)組和無(wú)序數(shù)組,依次將無(wú)序數(shù)組中的值插入到無(wú)序數(shù)組中。

如圖,插入4的過(guò)程如下 將數(shù)組分為2端,有序數(shù)組和無(wú)序數(shù)組,依次將無(wú)序數(shù)組中的值插入到無(wú)序數(shù)組中。

如下圖3 6 7為有序數(shù)組,4 2為無(wú)序數(shù)組。依次將4,2插入到無(wú)序數(shù)組中即可

如圖,插入4的過(guò)程如下

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

public static void insertionSort(int[] a) {
    for (int i = 1; i < a.length; i++) {
        int temp = a[i];
        int j;
        // 查到合適的插入位置,插入即可
        for (j = i - 1; j >= 0 && a[j] > temp; j--) {
            a[j + 1] = a[j];
        }
        a[j + 1] = temp;
    }
}

希爾排序 (ShellSort)

算法描述:

希爾排序是基于插入排序改進(jìn)后的算法。因?yàn)楫?dāng)數(shù)據(jù)移動(dòng)次數(shù)太多時(shí)會(huì)導(dǎo)致效率低下。所以我們可以先讓數(shù)組整體有序(剛開(kāi)始移動(dòng)的幅度大一點(diǎn),后面再小一點(diǎn)),這樣移動(dòng)的次數(shù)就會(huì)降低,進(jìn)而提高效率

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

public static void shellSort(int[] a) {
    for (int step = a.length / 2; step > 0; step /= 2) {
    //接下來(lái)的過(guò)程類(lèi)似于插入排序
        for (int i = step; i < a.length; i++) {
            int temp = a[i];
            int j;
            for (j = i - step; j >= 0 && a[j] > temp ; j -= step) {
                a[j + step] = a[j];
            }
            a[j + step] = temp;
        }
    }
}

歸并排序(MergetSort)

算法描述:

1.申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列;

2.設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置;

3.比較兩個(gè)指針?biāo)赶虻脑?,選擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置;

4.重復(fù)步驟 3 直到某一指針達(dá)到序列尾;

將另一序列剩下的所有元素直接復(fù)制到合并序列尾。

方便理解,直接網(wǎng)上找圖

請(qǐng)?zhí)砑訄D片描述

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

public static void mergeSort(int[] a, int left, int right) {
    // 將數(shù)組分段成只有一個(gè)元素
    if (left == right) {
        return;
    }
    int mid = (left + right) / 2;
    mergeSort(a, left, mid);//遞歸
    mergeSort(a, mid + 1, right);
    merge(a, left, mid, right);
}

public static void merge(int[] a, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left;
    int j = mid + 1;
    int k = 0;
    while (i <= mid && j <= right) {
        if (a[i] < a[j]) {
            temp[k++] = a[i++];
        } else {
            temp[k++] = a[j++];
        }
    }
    // 復(fù)制左邊數(shù)組剩余的值
    while (i <= mid) {
        temp[k++] = a[i++];
    }
    // 復(fù)制右邊數(shù)組剩余的值
    while (j <= right) {
        temp[k++] = a[j++];
    }
    int index = 0;
    //把temp全部復(fù)制給數(shù)組
    while (left <= right) {
        a[left++] = temp[index++];
    }
}

快速排序(QuickSort)

算法描述:

  • 快速排序的執(zhí)行流程主要分為如下三步
  • 從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)
  • 分區(qū),將比它大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊
  • 再對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)

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

public static void quickSort(int[] a, int left, int right) {
    if (left >= right) {
        return;
    }
    int index = sort(a, left, right);
    //得到中間值index,然后一分為二,繼續(xù)分
    quickSort(a, left, index - 1);
    quickSort(a, index + 1, right);
}

public static int sort(int[] a, int left, int right) {
//以左邊的a[left]為基準(zhǔn)數(shù)
    int key = a[left];
    while (left < right) {
        // 從right所指位置向前搜索找到第一個(gè)關(guān)鍵字小于key的記錄和key互相交換
        while (left < right && a[right] >= key) {
            right--;
        }
        a[left] = a[right];
        // 從left所指位置向后搜索,找到第一個(gè)關(guān)鍵字大于key的記錄和key互相交換
        while (left < right && a[left] <= key) {
            left++;
        }
        a[right] = a[left];
    }
    // 放key值,此時(shí)left和right相同
    a[left] = key;
    return left;
}

到此這篇關(guān)于Java輕松入門(mén)冒泡 選擇 插入 希爾 歸并排序算法的文章就介紹到這了,更多相關(guān)Java 排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot使用spring retry重試機(jī)制的操作詳解

    SpringBoot使用spring retry重試機(jī)制的操作詳解

    實(shí)際工作中由于網(wǎng)絡(luò)波動(dòng)等原因?qū)е麓a執(zhí)行失敗需要重新執(zhí)行,保證最終能夠完成業(yè)務(wù)功能,通常來(lái)說(shuō),會(huì)用try/catch,while循環(huán)或者定時(shí)任務(wù)重處理,但是這樣的做法缺乏統(tǒng)一性,要多寫(xiě)很多代碼,spring-retry組件可以通過(guò)注解優(yōu)雅的實(shí)現(xiàn)重處理功能
    2024-12-12
  • java數(shù)據(jù)庫(kù)開(kāi)發(fā)之JDBC基礎(chǔ)使用方法及實(shí)例詳解

    java數(shù)據(jù)庫(kù)開(kāi)發(fā)之JDBC基礎(chǔ)使用方法及實(shí)例詳解

    這篇文章主要介紹了java數(shù)據(jù)庫(kù)開(kāi)發(fā)之JDBC基礎(chǔ)知識(shí)詳解,需要的朋友可以參考下
    2020-02-02
  • springboot項(xiàng)目如何使用切面記錄用戶操作日志

    springboot項(xiàng)目如何使用切面記錄用戶操作日志

    這篇文章主要介紹了springboot項(xiàng)目如何使用切面記錄用戶操作日志,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)

    jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)

    這篇文章主要介紹了jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java實(shí)現(xiàn)布隆過(guò)濾器的幾種方式總結(jié)

    Java實(shí)現(xiàn)布隆過(guò)濾器的幾種方式總結(jié)

    這篇文章給大家總結(jié)了幾種Java實(shí)現(xiàn)布隆過(guò)濾器的方式,手動(dòng)硬編碼實(shí)現(xiàn),引入Guava實(shí)現(xiàn),引入hutool實(shí)現(xiàn),通過(guò)redis實(shí)現(xiàn)等幾種方式,文中有詳細(xì)的代碼和圖解,需要的朋友可以參考下
    2023-07-07
  • java分形繪制科赫雪花曲線(科赫曲線)代碼分享

    java分形繪制科赫雪花曲線(科赫曲線)代碼分享

    部分與整體以某種形式相似的形,稱(chēng)為分形,科赫曲線是一種外形像雪花的幾何曲線,所以又稱(chēng)為雪花曲線,它是分形曲線中的一種,畫(huà)法如下
    2013-12-12
  • MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫(xiě)方式

    MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫(xiě)方式

    這篇文章主要介紹了MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫(xiě)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行

    Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行

    在開(kāi)發(fā)過(guò)程中,盡量會(huì)將比較耗時(shí)且并不會(huì)影響請(qǐng)求的響應(yīng)結(jié)果的業(yè)務(wù)放在異步線程池中進(jìn)行處理,那么到時(shí)什么任務(wù)在執(zhí)行的時(shí)候會(huì)創(chuàng)建單獨(dú)的線程進(jìn)行處理呢?這篇文章主要介紹了Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行
    2023-04-04
  • Java TreeSet 添加失敗的解決

    Java TreeSet 添加失敗的解決

    這篇文章主要介紹了Java TreeSet 添加失敗的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 200行Java代碼如何實(shí)現(xiàn)依賴注入框架詳解

    200行Java代碼如何實(shí)現(xiàn)依賴注入框架詳解

    依賴注入對(duì)大家來(lái)說(shuō)應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用200行Java代碼如何實(shí)現(xiàn)依賴注入框架的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05

最新評(píng)論

富蕴县| 清远市| 和平区| 巫山县| 福建省| 沾化县| 长兴县| 凯里市| 沧州市| 讷河市| 荥经县| 昭通市| 依安县| 太湖县| 蚌埠市| 鸡东县| 多伦县| 拜泉县| 肃宁县| 麻阳| 凯里市| 静宁县| 西贡区| 新邵县| 长葛市| 阿拉善右旗| 贵德县| 绥化市| 大渡口区| 永安市| 边坝县| 喀喇沁旗| 伊吾县| 昔阳县| 高唐县| 白玉县| 绥滨县| 普格县| 宜川县| 淮安市| 临洮县|