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

java版十大排序經(jīng)典算法:完整代碼(3)

 更新時間:2021年07月27日 09:35:33   作者:牛哄哄的柯南  
優(yōu)秀的文章也不少,但是Java完整版的好像不多,我把所有的寫一遍鞏固下,同時也真誠的希望閱讀到這篇文章的小伙伴們可以自己去從頭敲一遍,不要粘貼復(fù)制!希望我的文章對你有所幫助,每天進步一點點

歸并排序

簡單解釋:該算法是采用分治法,把數(shù)組不斷分割,直至成為單個元素,然后比較再合并(合并的過程就是兩部分分別從頭開始比較,取出最小或最大元素的放到新的區(qū)域內(nèi),繼續(xù)取兩部分中最大或最小的元素,直到這兩部分合并完,最后所有的都合并完,最后形成完整的有序序列)

完整代碼:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: MergeSort
 * @Description: 歸并排序
 * @author: 牛哄哄的柯南
 * @date: 2021-06-24 10:35
 */
public class MergeSort {
    //歸并排序
    public static void mergeSort(int []arr ,boolean ascending){
        int[] temp = new int[arr.length]; //在排序前,先建好一個長度等于原數(shù)組長度的臨時數(shù)組,避免遞歸中頻繁開辟空間
        mergeSort(arr,0,arr.length-1,temp,ascending);
    }
    public static void mergeSort(int []arr){
        mergeSort(arr,true);
    }
    /**
     *
     * @param arr 傳入的數(shù)組
     * @param left 當前子數(shù)組的起始下標
     * @param right 當前子數(shù)組的結(jié)束下標
     * @param temp 拷貝暫存數(shù)組
     */
    public static void mergeSort(int []arr,int left,int right,int[] temp,boolean ascending){
        if(left<right){ //這里是遞歸結(jié)束的條件,我們是對半分,那當left==right的時候肯定大家都是只有一個元素了。
            //對半分,比如總長度是10,left=0,right=9,mid=4確實是中間分了,0~4,5~9
            //當長度9,left=0,right=8,mid=4,0~4,5~8
            int mid = left + (right-left)/2; // 防止越界的寫法
            //int mid = (left+right)/2;
            mergeSort(arr,left,mid,temp,ascending); //左邊歸并排序,使得左子序列有序
            mergeSort(arr,mid+1,right,temp,ascending); //右邊歸并排序,使得右子序列有序
            merge(arr,left,mid,right,temp,ascending); //將兩個有序子數(shù)組合并操作
        }
    }
    private static void merge(int[] arr,int left,int mid,int right,int[] temp,boolean ascending){
        int i = left; //左序列起始下標
        int j = mid+1; //右序列起始下標
        int t = 0; //臨時數(shù)組指針
        while(i<=mid&&j<=right){
            if(ascending?arr[i]<arr[j]:arr[i]>arr[j]){ //比較兩個序列第一個元素誰小,誰小先拷貝誰到temp,然后對應(yīng)子序列下標加1
                temp[t++] = arr[i++];
            }else {
                temp[t++] = arr[j++];
            }
        }
        while(i<=mid){ //將左邊剩余元素填充進temp中——左序列有一些數(shù)總是比右邊的大的數(shù)
            temp[t++] = arr[i++];
        }
        while(j<=right){ //將右序列剩余元素填充進temp中——右序列有一些數(shù)總是比左邊的大的數(shù)
            temp[t++] = arr[j++];
        }
        t = 0;
        //將temp中的元素全部拷貝到原數(shù)組中
        while(left<=right){
            arr[left++] = temp[t++];
        }
    }
}

插入排序

簡單解釋:最簡單的理解就是打地主時我們拿到牌后的整理過程,從第二個牌(假設(shè)我們拿起來這個牌開始比較)開始,(說下升序)從后往前比較如果比前面的那個牌小,就把牌往后移動,直到找到一個合適的位置(這個位置的前面的那個牌不比這個要放下的牌大)就把這個牌放到這個位置,慢慢的前面的部分變得有序,直至全部有序即可。

完整代碼:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: StraghtInsertSort
 * @Description: 插入排序
 * @author: 牛哄哄的柯南
 * @date: 2021-06-24 10:36
 */
public class StraghtInsertSort {
    //插入排序
    public static void straghtInsertSort(int[] arr) {
        straghtInsertSort(arr, true);//默認進行升序
    }
    public static void straghtInsertSort(int[] arr, boolean ascending) {
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int j=0; //這就是那個合適的位置
            for (j = i - 1; j >= 0 && (ascending ? temp < arr[j] : temp > arr[j]); j--) {
                arr[j + 1] = arr[j];
            }
            //把牌放下,為啥是j+1,
            //是因為上面的循環(huán)遍歷到不符合情況的時候 j是合適的位置的前面的那個數(shù)的位置
            //有點拗口,但是就是這個意思,看圖方便理解下
            arr[j + 1] = temp;

        }
    }
}

希爾排序

簡單解釋:希爾排序是插入排序的改進版,我們理解一個叫做下標差的的東西,也就是下面那個圖中的增量d,初始下標差為arr.length/2,然后繼續(xù)/2,對在同一下標差(相當于把這幾個數(shù)單獨拿出來了)的若干個數(shù)進行插入排序即可。

完整代碼:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: ShellSort
 * @Description: 希爾排序
 * @author: 牛哄哄的柯南
 * @date: 2021-06-24 10:39
 */
public class ShellSort {
    public static void shellSort(int[] arr) {
        shellSort(arr,true);
    }
    public static void shellSort(int[] arr,boolean ascending) {
        for(int d = arr.length/2;d>0;d/=2){
            for(int i=d;i< arr.length;i++){
                int temp = arr[i];
                int j=0;
                for(j=i-d;j>=0&&(ascending?temp<arr[j]:temp>arr[j]);j-=d){
                    arr[j+d]=arr[j];
                }
                arr[j+d] = temp;
            }
        }
    }
}

總結(jié)

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

相關(guān)文章

  • java處理字節(jié)的常用工具類

    java處理字節(jié)的常用工具類

    這篇文章主要為大家詳細介紹了java處理字節(jié)的常用工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java中Long類型傳入前端數(shù)值出錯問題

    Java中Long類型傳入前端數(shù)值出錯問題

    這篇文章主要介紹了Java中Long類型傳入前端數(shù)值出錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java中的悲觀鎖與樂觀鎖是什么

    Java中的悲觀鎖與樂觀鎖是什么

    這篇文章主要介紹了Java中的悲觀鎖與樂觀鎖是什么,幫助大家更好的理解和學(xué)習(xí)Java鎖的相關(guān)知識,感興趣的朋友可以了解下
    2020-09-09
  • 輕松了解java中Caffeine高性能緩存庫

    輕松了解java中Caffeine高性能緩存庫

    本文我們將學(xué)習(xí)了解到用于Java的高性能緩存庫Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08
  • maven install報錯中程序包xxx不存在的問題解決

    maven install報錯中程序包xxx不存在的問題解決

    本文主要介紹了maven install報錯中程序包xxx不存在的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Mybatis開啟控制臺打印sql語句方式

    Mybatis開啟控制臺打印sql語句方式

    這篇文章主要介紹了Mybatis開啟控制臺打印sql語句方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 輕松掌握Java適配器模式

    輕松掌握Java適配器模式

    這篇文章主要幫助大家輕松掌握Java適配器模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java實體類之間的相互轉(zhuǎn)換方式

    Java實體類之間的相互轉(zhuǎn)換方式

    這篇文章主要介紹了Java實體類之間的相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java高級用法之綁定CPU的線程Thread?Affinity簡介

    java高級用法之綁定CPU的線程Thread?Affinity簡介

    java線程thread affinity是用來將java代碼中的線程綁定到CPU特定的核上,用來提升程序運行的性能,這篇文章主要介紹了java高級用法之綁定CPU的線程thread affinity的相關(guān)知識,需要的朋友可以參考下
    2022-05-05
  • SpringBoot一個接口多個實現(xiàn)類的調(diào)用方式總結(jié)

    SpringBoot一個接口多個實現(xiàn)類的調(diào)用方式總結(jié)

    這篇文章主要介紹了SpringBoot一個接口多個實現(xiàn)類的調(diào)用方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01

最新評論

高雄市| 凌源市| 广汉市| 长垣县| 蓬安县| 双牌县| 广平县| 台南县| 晋宁县| 平邑县| 富阳市| 定远县| 南岸区| 岳西县| 彭山县| 哈密市| 余干县| 昆明市| 牙克石市| 天全县| 克拉玛依市| 木兰县| 察雅县| 宁陵县| 樟树市| 海口市| 南阳市| 潼南县| 元阳县| 屏东县| 郸城县| 韶关市| 阜城县| 夹江县| 临高县| 龙井市| 三门县| 池州市| 甘泉县| 琼海市| 邳州市|