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

Java插入排序算法實現(xiàn)方法例子

 更新時間:2024年10月08日 10:37:35   作者:小川_wenxun  
所謂排序,是將一組數(shù)據(jù)按照特定順序重新排列的過程,穩(wěn)定排序算法中相同鍵值的元素排序后保持原有順序,直接插入排序和希爾排序是插入排序的兩種形式,這篇文章主要介紹了Java插入排序算法實現(xiàn)的相關(guān)資料,需要的朋友可以參考下

排序的概念

排序:所謂的排序,就是使一串記錄,按照某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作。

穩(wěn)定性:假定在待排序的記錄序列中,存在多個具有相同的關(guān)鍵字的記錄,若經(jīng)過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序算法是穩(wěn) 定的;否則稱為不穩(wěn)定的。

 常見的排序算法有下面四種:

  • 插入排序:直接插入排序,希爾排序
  • 選擇排序:選擇排序,堆排序
  • 交換排序:冒泡排序,快速排序
  • 歸并排序:歸并排序

這里主要介紹Java如何實現(xiàn)插入排序中的直接排序和希爾排序。

插入排序

基本思想:把待排序的記錄按照其關(guān)鍵碼值的大小逐個插入到一個已經(jīng)拍好的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列。生活中的例子,就像我們在完撲克牌的時候機型排序一樣。

直接插入排序

思路:

直接插入排序的過程就像是有一組無序數(shù)據(jù),用第二個元素先和第一個元素比較,如果第一個元素比第二個元素大,那么二者就交換位置,否則繼續(xù)往后推,隨著往后推,每一次前一個元素都要不斷和之前排序過的元素進行比較。

 Sort類

public class Sort {
    /**
     * 時間復雜度:O(N^2)
     * 空間復雜度:O(1)
     * 穩(wěn)定性:穩(wěn)定的排序
     * @param array
     */
    //直接插入排序
    public static void insertSort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i-1;
            for (; j >= 0; j--) {
                if(arr[j] > tmp){
                    arr[j+1] = arr[j];
                }else{
                    arr[j+1] = tmp;
                    break;
                }
            }
            //確保j位置的數(shù),也就是前一個數(shù)能換位成功
            arr[j+1] = tmp;
        }
    }
}

Test類 測試類

public class Test {
    public static void main(String[] args) {
        int[] arr = {12,6,59,45,73,26,2};
        System.out.println("排序前:" + Arrays.toString(arr));
        Sort.insertSort(arr);
        System.out.println("排序前:" + Arrays.toString(arr));
    }
}

輸出結(jié)果為:

 關(guān)于i=1,且i < arr.length思路,因為數(shù)組是從0開始的,所以arr[6]的位置剛好是最后一位。

通過上面的動圖我們不難發(fā)現(xiàn),如果數(shù)組一開始越有序,直接插入排序的效率越高,這也為下面的哈希排序提供了思路。

穩(wěn)定性

直接插入排序是穩(wěn)定的,由上面圖片能看到它是具有穩(wěn)定性的,但如果是代碼部分的 arr[j] > tmp 改為:arr[j] >=  tmp,以上面的2a和2b為例,它們的順序就會發(fā)生變化。那么這還能說直接插入排序是穩(wěn)定的嗎?

當然能,因為 本身是一個穩(wěn)定的排序,那么可以實現(xiàn)為不穩(wěn)定的。

但是,如果一個排序 本身是不穩(wěn)定的,那就不能實現(xiàn)穩(wěn)定的排序。

哈希排序

哈希排序可以看作是直接插入排序的優(yōu)化,先通過 gap來不斷簡化 其中的有序性,然后再用直接插入排序,越有序,直接插入排序的時間復雜度越小,速度越快。

通過間隔分為不同的組,組內(nèi)進行排序,然后再縮短gap來進行再次排序。

代碼為

public static void shellInsert(int[] array){
    int gap = array.length;
    while(gap > 1){
        gap /= 2;
        shell(array, gap);
    }
}

private static void shell(int[] array, int gap) {
    for (int i = gap; i < array.length; i++) {
        int tmp = array[i];
        int j = i-gap;
        for (; j >= 0; j-= gap) {
            if(array[j] > tmp){
                array[j+gap] = array[j];
            }else{
                array[j+gap] = tmp;
                break;
            }
        }
        array[j+gap] = tmp;
    }
}

到這里,插入排序中的直接插入排序和希爾排序就結(jié)束了,接下來我會繼續(xù)給出剩下排序的思路和代碼。

總結(jié)

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

相關(guān)文章

  • SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能

    SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能

    這篇文章主要介紹了SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • JAVA SE包裝類和泛型詳細介紹及說明方法

    JAVA SE包裝類和泛型詳細介紹及說明方法

    這篇文章主要介紹了JAVA SE包裝類和泛型的相關(guān)資料,包括基本數(shù)據(jù)類型與包裝類的對應關(guān)系,以及裝箱和拆箱的概念,并重點講解了自動裝箱和自動拆箱的機制,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • SpringBoot后端進行數(shù)據(jù)校驗JSR303的使用詳解

    SpringBoot后端進行數(shù)據(jù)校驗JSR303的使用詳解

    這篇文章主要介紹了SpringBoot后端進行數(shù)據(jù)校驗JSR303的使用詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java實現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例

    Java實現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例

    本文介紹了如何使用Java實現(xiàn)WORD和PDF的互轉(zhuǎn)以及數(shù)據(jù)填充功能,通過導入Aspose庫并使用其工具類,可以輕松實現(xiàn)WORD和PDF模板的填充和轉(zhuǎn)換,需要的朋友可以參考下
    2025-02-02
  • shell腳本運行java程序jar的方法

    shell腳本運行java程序jar的方法

    本篇文章主要介紹了shell腳本運行java程序jar的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java雙重MD5加密實現(xiàn)安全登錄

    Java雙重MD5加密實現(xiàn)安全登錄

    MD5對密碼進行加密存儲是常見的一種加密方式,本文主要介紹了Java雙重MD5加密實現(xiàn)安全登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java線程池用法實戰(zhàn)案例分析

    Java線程池用法實戰(zhàn)案例分析

    這篇文章主要介紹了Java線程池用法,結(jié)合具體案例形式分析了java線程池創(chuàng)建、使用、終止等相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-10-10
  • 圖文詳解OkHttp的超時時間

    圖文詳解OkHttp的超時時間

    HTTP是現(xiàn)代應用常用的一種交換數(shù)據(jù)和媒體的網(wǎng)絡(luò)方式,高效地使用HTTP能讓資源加載更快,節(jié)省帶寬,OkHttp是一個高效的HTTP客戶端,下面這篇文章主要給大家介紹了關(guān)于OkHttp超時時間的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 圖文詳解MyEclipse更換背景主題的方法

    圖文詳解MyEclipse更換背景主題的方法

    今天小編就為大家分享一篇關(guān)于MyEclipse更換背景主題的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java實現(xiàn)簡單的圖書借閱系統(tǒng)

    java實現(xiàn)簡單的圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

沧源| 都安| 贵溪市| 云林县| 上林县| 鄂尔多斯市| 五家渠市| 穆棱市| 合水县| 三河市| 永德县| 北京市| 木兰县| 启东市| 兴化市| 高唐县| 临沭县| 德安县| 鱼台县| 通城县| 名山县| 马关县| 恩施市| 吉安市| 建湖县| 繁昌县| 崇阳县| 高邮市| 江华| 永宁县| 鹤山市| 鱼台县| 垣曲县| 达孜县| 鄂州市| 龙游县| 合肥市| 巍山| 随州市| 大宁县| 凤山县|