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

圖解Java經(jīng)典算法冒泡選擇插入希爾排序的原理與實現(xiàn)

 更新時間:2022年09月24日 14:50:53   作者:小黎的培培筆錄  
冒泡排序是一種簡單的排序算法,它也是一種穩(wěn)定排序算法。其實現(xiàn)原理是重復(fù)掃描待排序序列,并比較每一對相鄰的元素,當(dāng)該對元素順序不正確時進(jìn)行交換。一直重復(fù)這個過程,直到?jīng)]有任何兩個相鄰元素可以交換,就表明完成了排序

一、冒泡排序

1、基本介紹

冒泡排序是重復(fù)地走訪要排序的元素,依次比較兩個相鄰的元素,如果它們的順序與自己規(guī)定的不符合,則把兩個元素的位置交換。走訪元素重復(fù)地進(jìn)行,直到?jīng)]有相鄰元素需要交換為止,完成整個排序過程。

? 算法原理

1、比較相鄰元素,如果前一個元素大于后一個元素,則交換。

2、依次向后對每一對相鄰元素做同樣的工作,直到隊列末尾,第一輪過后最大的元素就位于最后一個元素位置了。

3、重復(fù)以上步驟,直到最后一個元素位置的前一位為止(因為最后一位已經(jīng)排了)。

4、持續(xù)每次對越來越少的元素重復(fù)上面步驟,直到第一個元素和第二個元素交換后順序為從大到小或從小到大,排序結(jié)束。

2、代碼實現(xiàn)

冒泡排序?qū)嶋H上就是兩個數(shù)兩個數(shù)的比較,每循環(huán)一次將最大或最小的數(shù)放在最后,剩下的就繼續(xù)兩兩比較。

public static void bubbleSort(int[] arr){
        //中間變量,用來交換數(shù)據(jù)
        int temp = 0;
        //外層循環(huán)
        for (int i = 0 ; i < arr.length - 1 ; i++){
            //內(nèi)層循環(huán),每次找到最大的數(shù)后放在最后,下次遍歷則會少一次,及arr.length - i - 1
            for(int j = 0; j < arr.length - i - 1; j++){
                //判斷大小
                if(arr[j] > arr[j + 1]){
                    //將兩數(shù)進(jìn)行交換
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
}

二、 選擇排序

1、基本介紹

首先第一次確定第一個數(shù)為最小的,然后利用for循環(huán),將第一個數(shù)后的數(shù)據(jù)遍歷一遍,找是否還有比第一個數(shù)更小的,記錄下來,遍歷完畢后將第一個數(shù)與最小的數(shù)進(jìn)行交換。然后又確定第二數(shù),找第二個數(shù)以后的數(shù),是否還有比第二個數(shù)更小的,找到后與第二個數(shù)又進(jìn)行交換,重復(fù)上面即可。

以后的每次循環(huán)都是按照這種方式,直到最后兩個數(shù)排完,數(shù)據(jù)就是有序的了。

2、代碼實現(xiàn)

public static void choiceSort(int[] arr){
        //用來記錄最小的數(shù)
        int arrData = 0;
        //記錄最小的數(shù)的下標(biāo)
        int arrindx = 0;
        //外層循環(huán),直到 arr.length - 1 即可
        for(int i = 0; i < arr.length - 1; i++){
            //首先把arr[i] 當(dāng)做最小的數(shù),并記錄下標(biāo)
            arrData = arr[i];
            arrindx = i;
            //內(nèi)層循環(huán),遍歷 i 以后的數(shù),找到比 arr[i] 還小的數(shù)
            for (int j = i + 1; j < arr.length; j++){
                //找到更小的數(shù),就進(jìn)行記錄
                if(arrData > arr[j]){
                    arrData = arr[j];
                    arrindx = j;
                }
            }
            //循環(huán)完畢,說明找到了,最小的數(shù),與arr[i] 進(jìn)行交換即可
            arr[arrindx] = arr[i];
            arr[i] = arrData;
        }
}

三、插入排序

1、基本介紹

前面我們介紹的選擇排序,找到最小的就與前面的進(jìn)行交換。而插入排序,就是將確定的數(shù)的后一位插入到前面即可。圖形介紹:

開始,id指向第一個數(shù),mid指向第二個數(shù),然后兩個數(shù)進(jìn)行比較。

此時,1 比 3 小,但是3前面沒數(shù)據(jù)了,于是將1插入到3的前面,注意這里是插入,不是交換。下一步 3 比 5 小,于是不用插入。

經(jīng)過三次比較,確定了 2 的位置在 1 和 3 直接,直接將 2 插入。

又經(jīng)過四次比較,找到 0 的位置 在 1 的前面,于是將 0 插入到 1 的前面即可。

2、代碼實現(xiàn)

 public static void insertSort(int[] arr){
        //下標(biāo)為 0 的數(shù)是確定的,從下標(biāo)為 1 開始循環(huán)
        for (int i = 1; i < arr.length; i++){
            // 將下標(biāo)為 i 的數(shù)暫存起來
            int arrData = arr[i];
            //從 i - 1 開始往前循環(huán)
            int arrIndx = i - 1;
            //判斷退出的條件 大于等于0
            while (arrIndx >= 0){
                //如果arrData 大于 下標(biāo)為arrIndx 的數(shù),則位置找到,退出循環(huán)
                if (arrData > arr[arrIndx]){
                    break;
                }
                //沒有找到,就將前面的數(shù)往后移
                arr[arrIndx + 1] = arr[arrIndx];
                arrIndx--;
            }
            //找到位置后,就將暫存的數(shù)據(jù)arrData 插入到下標(biāo)為arrIndx的位置
            arr[arrIndx + 1] = arrData;
        }
    }

四、希爾排序

1、基本介紹

首先將數(shù)組分為兩組,3、2、0 為一組,1、5為一組,g = arr.length / 2。

2 和 3 進(jìn)行判斷,3 比 2 大 ,然后進(jìn)行交換位置,交換后 j = j- g< 0(因為第一次的分為兩組,所以 i - 2)。所以 i++ ,j = i - g

不需要交換, 然后 j = j- g < 0 ,所以 i++ ,j = i - g

3 比 0 大 ,需要交換。然后 j = j - g > 0 , j = j - g

交換后 j = j - g < 0 , i++ > arr.length 了,第一輪結(jié)束

第二輪:在arr.length / 2的基礎(chǔ)上再除2 , 于是 g = 1 ;

然后兩兩交換,交換后 進(jìn)行j = j - g > 0 的判斷 ,不成立則 i++, j = i - g ,成立則 j = j - g ,就這樣一直循環(huán)下去。第二輪后的結(jié)果:

第二輪結(jié)束后,g / 2 = 0 結(jié)果不大于 0,所以排序結(jié)束

2、代碼實現(xiàn)(交換排序)

    public static void shellSort_exchange(int[] arr){
        //做中間變量,進(jìn)行數(shù)據(jù)交換
        int temp = 0;
        // g 首先數(shù)組總長除以2, 然后每次除以2
        for(int g = arr.length / 2 ; g > 0 ; g /= 2){
            // i 從 g 的位置開始遍歷
            for(int i = g ; i < arr.length ; i++){
                // j 從 i - g 的位置開始向前遍歷,j 的位置由 j - g 來決定
                for(int j = i - g ; j >= 0 ; j -= g){
                    //判斷 下標(biāo)(j + g) 和 下標(biāo)j 位置的數(shù)的大小,然后進(jìn)行交換
                    if(arr[j + g] < arr[j]){
                        //交換即可
                        temp = arr[j + g];
                        arr[j + g] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
        }
    }

3、代碼實現(xiàn)(移位排序)

移位排序的思想與前面的交換排序一樣的,只是在交換數(shù)的方式上有變化。交換排序數(shù)的交換方式來自冒泡排序,而移位排序數(shù)的交換方式來自插入排序。

    public static void test1(int[] arr){
        //與前面一樣,開始數(shù)組長度除以2 , 然后每次除以2
        for(int g = arr.length / 2 ; g > 0 ; g /= 2){
            // i 從 g 位置開始,每次加一
            for(int i = g ; i < arr.length ; i++){
                //定義 j 的位置 為 i
                int j = i ;
                //將 下標(biāo)為 i 位置的數(shù)暫存起來
                int temp = arr[i];
                //判斷 下標(biāo)j位置的數(shù) 和 j - g 位置的數(shù),與前面一樣
                if(arr[j] < arr[j - g] ){
                    //遍歷循環(huán)
                    while(j - g >= 0 && temp < arr[j - g]){
                        //滿足條件,就移位,將前面的數(shù) (下標(biāo)j - g) 往后移 (下標(biāo)j)
                        arr[j] = arr[j - g];
                        j -= g;// j 每次 -g
                    }
                }
                //退出循環(huán)或判斷條件后,將暫存的temp (arr[i]) 賦值給 arr[j]
                arr[j] = temp;
            }
        }
    }

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

相關(guān)文章

  • java操作mongodb示例分享

    java操作mongodb示例分享

    這篇文章主要介紹了java操作mongodb示例,實現(xiàn)了簡單的條件查詢和復(fù)雜的條件查詢,需要的朋友可以參考下
    2014-02-02
  • Java中的BlockingQueue阻塞隊列原理以及實現(xiàn)詳解

    Java中的BlockingQueue阻塞隊列原理以及實現(xiàn)詳解

    這篇文章主要介紹了Java中的BlockingQueue阻塞隊列原理以及實現(xiàn)詳解,在最常見的使用到這個阻塞隊列的地方,就是我們耳熟能詳?shù)木€程池里面了,作為我們線程池的一大最大參與者,也是AQS的一個具體實現(xiàn),需要的朋友可以參考下
    2023-12-12
  • java郵件發(fā)送簡單實現(xiàn)代碼

    java郵件發(fā)送簡單實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java郵件發(fā)送簡單實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • sharding-jdbc讀寫分離原理詳細(xì)解析

    sharding-jdbc讀寫分離原理詳細(xì)解析

    這篇文章主要介紹了sharding-jdbc讀寫分離原理詳細(xì)解析,很多時候,為了應(yīng)付DB的高并發(fā)讀寫,我們會采用讀寫分離技術(shù),讀寫分離指的是利用數(shù)據(jù)庫主從技術(shù)(把數(shù)據(jù)復(fù)制到多個節(jié)點中),分散讀多個庫以支持高并發(fā)的讀,需要的朋友可以參考下
    2023-12-12
  • SpringBoot實現(xiàn)PDF添加水印的示例

    SpringBoot實現(xiàn)PDF添加水印的示例

    本文主要介紹了SpringBoot實現(xiàn)PDF添加水印的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java實現(xiàn)簡單的迷宮游戲詳解

    Java實現(xiàn)簡單的迷宮游戲詳解

    迷宮游戲作為經(jīng)典的小游戲,一直深受大家的喜愛。本文小編將為大家詳細(xì)介紹一下如何用Java實現(xiàn)一個簡單的迷宮小游戲,感興趣的可以動手試一試
    2022-02-02
  • 利用Java讀取二進(jìn)制文件實例詳解

    利用Java讀取二進(jìn)制文件實例詳解

    這篇文章主要給大家介紹了利用Java讀取二進(jìn)制文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Spring+Junit4進(jìn)行接口測試實例代碼

    Spring+Junit4進(jìn)行接口測試實例代碼

    這篇文章主要介紹了Spring+Junit4進(jìn)行接口測試實例代碼,涉及pom.xml、bean的配置,以及接口測試代碼等相關(guān)內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • 基于springMvc+hibernate的web application的構(gòu)建

    基于springMvc+hibernate的web application的構(gòu)建

    下面小編就為大家?guī)硪黄趕pringMvc+hibernate的web application的構(gòu)建。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java生成json數(shù)據(jù)示例

    java生成json數(shù)據(jù)示例

    這篇文章主要介紹了java生成json數(shù)據(jù)示例,需要的朋友可以參考下
    2014-04-04

最新評論

溧水县| 油尖旺区| 原阳县| 全南县| 深州市| 云林县| 南靖县| 塔河县| 临桂县| 庐江县| 临江市| 天祝| 赞皇县| 祁门县| 建湖县| 千阳县| 通江县| 赤壁市| 顺昌县| 绥阳县| 昆山市| 区。| 哈尔滨市| 平阳县| 新龙县| 全州县| 英山县| 琼中| 宕昌县| 鄂托克旗| 东安县| 大新县| 华宁县| 北辰区| 永顺县| 信宜市| 乡城县| 察隅县| 黑河市| 舞钢市| 麦盖提县|