亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java程序員必知的8大排序是什么

發布時間:2021-10-29 16:23:28 來源:億速云 閱讀:127 作者:柒染 欄目:編程語言

Java程序員必知的8大排序是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

8種排序之間的關系:

Java程序員必知的8大排序是什么

1, 直接插入排序

(1)基本思想:在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排

好順序的,現在要把第n個數插到前面的有序數中,使得這n個數

也是排好順序的。如此反復循環,直到全部排好順序。

(2)實例

Java程序員必知的8大排序是什么

(3)用java實現

 package com.njue;     public class insertSort {  public insertSort(){      inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};      int temp=0;      for(int i=1;i<a.length;i++){         int j=i-1;         temp=a[i];         for(;j>=0&&temp<a[j];j--){         a[j+1]=a[j];                       //將大于temp的值整體后移一個單位         }         a[j+1]=temp;      }      for(int i=0;i<a.length;i++)         System.out.println(a[i]);  }  }

2,希爾排序(最小增量排序)

(1)基本思想:算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然后再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序后,排序完成。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

public class shellSort {  public  shellSort(){      int a[]={1,54,6,3,78,34,12,45,56,100};      double d1=a.length;      int temp=0;      while(true){          d1= Math.ceil(d1/2);          int d=(int) d1;          for(int x=0;x<d;x++){              for(int i=x+d;i<a.length;i+=d){                  int j=i-d;                  temp=a[i];                  for(;j>=0&&temp<a[j];j-=d){                  a[j+d]=a[j];                  }                  a[j+d]=temp;              }          }          if(d==1)              break;      }      for(int i=0;i<a.length;i++)          System.out.println(a[i]);  }  }

3.簡單選擇排序

(1)基本思想:在要排序的一組數中,選出最小的一個數與***個位置的數交換;

然后在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和***一個數比較為止。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

public class selectSort {      public selectSort(){          int a[]={1,54,6,3,78,34,12,45};          int position=0;          for(int i=0;i<a.length;i++){                            int j=i+1;              position=i;              int temp=a[i];              for(;j<a.length;j++){              if(a[j]<temp){                  temp=a[j];                  position=j;              }              }              a[position]=a[i];              a[i]=temp;          }          for(int i=0;i<a.length;i++)              System.out.println(a[i]);      }  }

4,堆排序

(1)基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義如下:具有n個元素的序列(h2,h3,...,hn),當且僅當滿足(hi>=h3i,hi>=2i+1)或(hi<=h3i,hi<=2i+1) (i=1,2,...,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即***個元素)必為***項(大頂堆)。完全二叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數的序列看作是一棵順序存儲的二叉樹,調整它們的存儲序,使之成為一個堆,這時堆的根節點的數***。然后將根節點與堆的***一個節點交換。然后對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,并對它們作交換,***得到有n個節點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的***一個元素交換位置。所以堆排序有兩個函數組成。一是建堆的滲透函數,二是反復調用滲透函數實現排序的函數。

(2)實例:

初始序列:46,79,56,38,40,84

建堆:

Java程序員必知的8大排序是什么

交換,從堆中踢出***數

Java程序員必知的8大排序是什么

Java程序員必知的8大排序是什么

依次類推:***堆中剩余的***兩個結點交換,踢出一個,排序完成。

(3)用java實現

import java.util.Arrays;   public class HeapSort {       int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};      public  HeapSort(){          heapSort(a);      }      public  void heapSort(int[] a){          System.out.println("開始排序");          int arrayLength=a.length;          //循環建堆          for(int i=0;i<arrayLength-1;i++){              //建堆         buildMaxHeap(a,arrayLength-1-i);              //交換堆頂和***一個元素              swap(a,0,arrayLength-1-i);              System.out.println(Arrays.toString(a));          }      }       private  void swap(int[] data, int i, int j) {          // TODO Auto-generated method stub          int tmp=data[i];          data[i]=data[j];          data[j]=tmp;      }      //對data數組從0到lastIndex建大頂堆      private void buildMaxHeap(int[] data, int lastIndex) {          // TODO Auto-generated method stub          //從lastIndex處節點(***一個節點)的父節點開始          for(int i=(lastIndex-1)/2;i>=0;i--){              //k保存正在判斷的節點              int k=i;              //如果當前k節點的子節點存在              while(k*2+1<=lastIndex){                  //k節點的左子節點的索引                  int biggerIndex=2*k+1;                  //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節點的右子節點存在                  if(biggerIndex<lastIndex){                      //若果右子節點的值較大                      if(data[biggerIndex]<data[biggerIndex+1]){                          //biggerIndex總是記錄較大子節點的索引                          biggerIndex++;                      }                  }                  //如果k節點的值小于其較大的子節點的值                  if(data[k]<data[biggerIndex]){                      //交換他們                      swap(data,k,biggerIndex);                      //將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大于其左右子節點的值                      k=biggerIndex;                  }else{                      break;                  }              }<p align="left">&nbsp;<span>   </span>}</p><p align="left">&nbsp;&nbsp;&nbsp; }</p><p align="left">&nbsp;<span style="background-color: white; ">}</span></p>

5.冒泡排序

(1)基本思想:在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

public class bubbleSort {  public  bubbleSort(){       int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};      int temp=0;      for(int i=0;i<a.length-1;i++){          for(int j=0;j<a.length-1-i;j++){          if(a[j]>a[j+1]){              temp=a[j];              a[j]=a[j+1];              a[j+1]=temp;          }          }      }      for(int i=0;i<a.length;i++)      System.out.println(a[i]);     }  }

6.快速排序

(1)基本思想:選擇一個基準元素,通常選擇***個元素或者***一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

public class quickSort {    int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  public  quickSort(){      quick(a);      for(int i=0;i<a.length;i++)          System.out.println(a[i]);  }  public int getMiddle(int[] list, int low, int high) {                 int tmp = list[low];    //數組的***個作為中軸                 while (low < high) {                     while (low < high && list[high] >= tmp) {            high--;                     }                     list[low] = list[high];   //比中軸小的記錄移到低端                     while (low < high && list[low] <= tmp) {                         low++;                     }                     list[high] = list[low];   //比中軸大的記錄移到高端                 }                list[low] = tmp;              //中軸記錄到尾                 return low;                   //返回中軸的位置             }    public void _quickSort(int[] list, int low, int high) {                 if (low < high) {                    int middle = getMiddle(list, low, high);  //將list數組進行一分為二                     _quickSort(list, low, middle - 1);        //對低字表進行遞歸排序                    _quickSort(list, middle + 1, high);       //對高字表進行遞歸排序                 }             }   public void quick(int[] a2) {                 if (a2.length > 0) {    //查看數組是否為空                     _quickSort(a2, 0, a2.length - 1);             }            }   }

7、歸并排序

(1)基本排序:歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

import java.util.Arrays;   public class mergingSort {  int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  public  mergingSort(){      sort(a,0,a.length-1);      for(int i=0;i<a.length;i++)          System.out.println(a[i]);  }  public void sort(int[] data, int left, int right) {      // TODO Auto-generated method stub      if(left<right){          //找出中間索引          int center=(left+right)/2;          //對左邊數組進行遞歸          sort(data,left,center);          //對右邊數組進行遞歸          sort(data,center+1,right);          //合并          merge(data,left,center,right);                }  }  public void merge(int[] data, int left, int center, int right) {      // TODO Auto-generated method stub      int [] tmpArr=new int[data.length];      int mid=center+1;      //third記錄中間數組的索引      int third=left;      int tmp=left;      while(left<=center&&mid<=right){      //從兩個數組中取出最小的放入中間數組          if(data[left]<=data[mid]){              tmpArr[third++]=data[left++];          }else{              tmpArr[third++]=data[mid++];          }      }      //剩余部分依次放入中間數組      while(mid<=right){          tmpArr[third++]=data[mid++];      }      while(left<=center){          tmpArr[third++]=data[left++];      }      //將中間數組中的內容復制回原數組      while(tmp<=right){          data[tmp]=tmpArr[tmp++];      }      System.out.println(Arrays.toString(data));  }   }

8、基數排序

(1)基本思想:將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零。然后,從***位開始,依次進行一次排序。這樣從***位排序一直到***位排序完成以后,數列就變成一個有序序列。

(2)實例:

Java程序員必知的8大排序是什么

(3)用java實現

import java.util.ArrayList;  import java.util.List;   public class radixSort {      int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,101,56,17,18,23,34,15,35,25,53,51};  public radixSort(){      sort(a);      for(int i=0;i<a.length;i++)          System.out.println(a[i]);  }  public  void sort(int[] array){                                  //首先確定排序的趟數;             int max=array[0];             for(int i=1;i<array.length;i++){                    if(array[i]>max){                    max=array[i];                    }                 }          int time=0;                //判斷位數;                 while(max>0){                    max/=10;                     time++;                 }                              //建立10個隊列;                 List<ArrayList> queue=new ArrayList<ArrayList>();                 for(int i=0;i<10;i++){                     ArrayList<Integer> queue1=new ArrayList<Integer>();                   queue.add(queue1);             }                                 //進行time次分配和收集;                 for(int i=0;i<time;i++){                                          //分配數組元素;                    for(int j=0;j<array.length;j++){                         //得到數字的第time+1位數;                      int x=array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);                     ArrayList<Integer> queue2=queue.get(x);                     queue2.add(array[j]);                     queue.set(x, queue2);              }                     int count=0;//元素計數器;                 //收集隊列元素;                     for(int k=0;k<10;k++){                   while(queue.get(k).size()>0){                      ArrayList<Integer> queue3=queue.get(k);                          array[count]=queue3.get(0);                             queue3.remove(0);                      count++;                }                 }               }                         }     }

看完上述內容,你們掌握Java程序員必知的8大排序是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遵义县| 工布江达县| 喀什市| 泗洪县| 香港| 广西| 莲花县| 太原市| 长寿区| 巨野县| 察隅县| 四平市| 清丰县| 宾川县| 镇原县| 肥乡县| 洛隆县| 墨脱县| 嵩明县| 嘉峪关市| 加查县| 巫溪县| 丰都县| 封丘县| 宣恩县| 宜春市| 庆安县| 疏附县| 贵溪市| 怀仁县| 海晏县| 南陵县| 吴忠市| 图木舒克市| 梧州市| 通辽市| 巴南区| 庄浪县| 屏南县| 道孚县| 乐亭县|