溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)冒泡排序法和選擇排序法

發(fā)布時(shí)間:2021-08-07 14:35:13 來源:億速云 閱讀:82 作者:Leah 欄目:編程語言

Java中怎么實(shí)現(xiàn)冒泡排序法和選擇排序法,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

冒泡排序法

概念:

從前向后(或從后向前)依次比較相鄰的元素,若發(fā)現(xiàn)逆順序,則交換。小的向前換,大的向后換,像水底的氣泡逐漸向上冒,顧名思義冒泡排序法。

通俗一點(diǎn)就是把大的往上挪!向冒泡一樣。

是交換式排序法的一種。冒泡排序法效率較低。

冒泡排序法思路

1:外層循環(huán):控制它要走幾次。 假設(shè)你有5個(gè)數(shù),那就要走4次,最后一次不用走,最后那個(gè)數(shù)已經(jīng)在它位置了所以就要length-1次。 2:內(nèi)層循環(huán):控制逐一比較,如果發(fā)現(xiàn)前一個(gè)數(shù)比后一個(gè)數(shù)大,則交換。 注意!因?yàn)樵奖容^長(zhǎng)度就越小了,所以長(zhǎng)度要length-1-i。

package com.test_1;public class Demo5_3 {  public static void main(String[] args) {    // TODO Auto-generated method stub    int arr [ ] ={1,6,0,-1,9};    int temp=0;//中間值    //-------冒泡排序法    //外層循環(huán),它決定一共走幾趟    for(int i = 0;i<arr.length-1;i++){      //內(nèi)層循環(huán),開始逐個(gè)比較      //如果我們發(fā)現(xiàn)前一個(gè)數(shù)比后一個(gè)數(shù)大,則交換      for(int j=0;j<arr.length-1-i;j++){        if (arr[j]>arr[j+1]) {          //換位          temp = arr[j];          arr[j] = arr[j+1];          arr[j+1] = temp;        }      }    }    //輸出結(jié)果    for(int i = 0;i<arr.length;i++){      System.out.print(arr[i]);    }  }}

選擇排序法

概念: 第一次從R[0]~R[n-1]中選取最小值,與R[0]交換。第二次從R[1]~R[n-1]中選取最小值與R[1]交換。。。以此類推。 通俗點(diǎn)說就是每次找到后面元素的最小值然后與之交換。 選擇排序法效率中。

選擇排序思路 1:外層循環(huán):要走幾趟,同樣是length-1。 2:設(shè)置一個(gè)最小值。假設(shè)第一個(gè)就是最小值。 3:設(shè)置一個(gè)最小值下標(biāo) 4:內(nèi)層循環(huán):那你當(dāng)前的最小值去逐一比較。當(dāng)有比當(dāng)前最小值小的數(shù)時(shí),記錄最小值,記錄下標(biāo)。 5:退出內(nèi)層循環(huán)后就交換位置。

package com.test_1;public class Demo5_3 {  public static void main(String[] args) {    //簡(jiǎn)單測(cè)試數(shù)組    int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};    //調(diào)用選擇排序法    Select select = new Select();    select.sort(arr);  }}//--------------選擇排序法class Select{  public void sort(int arr[]){    //中間值    int temp = 0;    //外循環(huán):我認(rèn)為最小的數(shù),從0~長(zhǎng)度-1    for(int j = 0; j<arr.length-1;j++){      //最小值:假設(shè)第一個(gè)數(shù)就是最小的      int min = arr[j];      //記錄最小數(shù)的下標(biāo)的      int minIndex=j;      //內(nèi)循環(huán):拿我認(rèn)為的最小的數(shù)和后面的數(shù)一個(gè)個(gè)進(jìn)行比較      for(int k=j+1;k<arr.length;k++){        //找到最小值        if (min>arr[k]) {          //修改最小          min=arr[k];          minIndex=k;        }      }      //當(dāng)退出內(nèi)層循環(huán)就找到這次的最小值      //交換位置      temp = arr[j];      arr[j]=arr[minIndex];      arr[minIndex]=temp;    }    //輸出結(jié)果    for(int i = 0;i<arr.length;i++){      System.out.print(arr[i]+"  ");    }  }}

最后再比較一下兩個(gè)排序法之間的效率差異: 代碼

package com.test_1;import java.util.Calendar;public class Demo5_3 {  public static void main(String[] args) {    //構(gòu)建一個(gè)龐大的無序數(shù)組用于測(cè)試時(shí)間    int len=100000;    int arr1 [] = new int [len];    for(int i=0;i<len;i++){      //讓程序隨機(jī)產(chǎn)生一個(gè)1~10000的數(shù)      //Math.random()會(huì)產(chǎn)生一個(gè)0~1的數(shù)      int t = (int)(Math.random()*10000);      arr1[i] = t;    }    //簡(jiǎn)單測(cè)試數(shù)組    int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};    //獲得時(shí)間實(shí)例    Calendar cal = Calendar.getInstance();    //在排序前打印系統(tǒng)時(shí)間    System.out.println("冒泡排序法開始"+cal.getTime());    //調(diào)用冒泡排序法    Bubble bubble = new Bubble();    bubble.sort(arr1);    //重新獲得時(shí)間實(shí)例    cal = Calendar.getInstance();    System.out.println("冒泡排序法結(jié)束"+cal.getTime());    //重新獲得時(shí)間實(shí)例    cal = Calendar.getInstance();    System.out.println("選擇排序法開始"+cal.getTime());    //調(diào)用選擇排序法    Select select = new Select();    select.sort(arr1);    //重新獲得時(shí)間實(shí)例    cal = Calendar.getInstance();    System.out.println("選擇排序法結(jié)束"+cal.getTime());  }}//-----------------冒泡排序法class Bubble{  //排序方法  public void sort(int arr[]){    int temp=0;//中間值    //-------冒泡排序法    //外層循環(huán),它決定一共走幾趟    for(int i = 0;i<arr.length-1;i++){      //內(nèi)層循環(huán),決定每一趟循環(huán)的次數(shù)      //如果我們發(fā)現(xiàn)前一個(gè)數(shù)比后一個(gè)數(shù)大,則交換      for(int j=0;j<arr.length-1-i;j++){        if (arr[j]>arr[j+1]) {          //換位          temp = arr[j];          arr[j] = arr[j+1];          arr[j+1] = temp;        }      }    }      /*//輸出結(jié)果        for(int i = 0;i<arr.length;i++){          System.out.print(arr[i]+"  ");        }*/  }  }//--------------選擇排序法class Select{  public void sort(int arr[])  {    //中間值    int temp = 0;    //外循環(huán):我認(rèn)為最小的數(shù),從0~長(zhǎng)度-1    for(int j = 0; j<arr.length-1;j++)    {      //最小值:假設(shè)第一個(gè)數(shù)就是最小的      int min = arr[j];      //記錄最小數(shù)的下標(biāo)的      int minIndex=j;      //內(nèi)循環(huán):拿我認(rèn)為的最小的數(shù)和后面的數(shù)一個(gè)個(gè)進(jìn)行比較找到下標(biāo)      for(int k=j+1;k<arr.length;k++)      {        //找到最小值        if (min>arr[k])         {          //修改最小          min=arr[k];          minIndex=k;        }      }      //當(dāng)退出內(nèi)層循環(huán)就找到這次的最小值      //交換位置      temp = arr[j];      arr[j]=arr[minIndex];      arr[minIndex]=temp;    }    /*//輸出結(jié)果    for(int i = 0;i<arr.length;i++){      System.out.print(arr[i]+"  ");    }*/  }}

看完上述內(nèi)容,你們掌握J(rèn)ava中怎么實(shí)現(xiàn)冒泡排序法和選擇排序法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI