常用排序算法的Java實現

  • (冒泡排序)大學裏面最早接觸的一種排序

    • 基本原理

      * 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。  
      * 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。  
      * 針對所有的元素重複以上的步驟,除了最後一個。
      * 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。 
    • 代碼實現

      public static void bubbleSort(int number[]) {
              for (int i = 0; i < number.length-1; i++)
                  for (int j = 0; j < number.length-i-1; j++) {
                      if(number[j]>number[j+1]){
                          int temp=number[j];
                          number[j]=number[j+1];
                          number[j+1]=temp;
                      }
              }
          }
  • 選擇排序

    • 基本思想

      在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。

      img

    • 代碼實現

      public static void selectSort(int number[]){
              for(int i=0;i<number.length;i++){
                  int minIndex=i;            //標註最小值,初始爲i
                  for(int j=i;j<number.length;j++){
                      if(number[j]<number[minIndex]){
                          minIndex=j;         //遍歷i之後的數組,找到最小的數
                      }
                  }
                  int temp=number[i];
                  number[i]=number[minIndex];
                  number[minIndex]=temp;      //將i和最小的交換
              }
          }
  • 快速排序

    • 基本思想

      通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,則分別對這兩部分繼續進行排序,直到整個序列有序。

      img

      代碼實現思路

      把整個序列看做一個數組,把第零個位置看做中軸,和最後一個比,如果比它小交換,比它大不做任何處理;交換了以後再和小的那端比,比它小不交換,比他大交換。這樣循環往復,一趟排序完成,左邊就是比中軸小的,右邊就是比中軸大的,然後再用分治法,分別對這兩個獨立的數組進行排序。
    • 代碼實現(遞歸實現)

      public static void quickSort(int number[],int low,int high){
              if(low<high){
                  int middle=findMiddle(number,low,high);  //將low放在數組中間位置,low前面的比它小,low後面的比它大
                  quickSort(number, low, middle);  //分治再次進行快速排序
                  quickSort(number, middle+1, high);
              }
          }
      
          public static int findMiddle(int number[],int low,int high){
              int temp=number[low];    //將數組的low位置的數看做中軸
              while(low<high){
                  while(low<high&&number[high]>=temp){
                      high--;                         
       //從後往前數找到第一個比temp小的,這裏一定要>=,不然如果數組中有相同的會出現stackOverFlow錯誤
                  }
                  number[low]=number[high]; //把那個大的數字放到low的位置上
                  while(low<high&&number[low]<=temp){
       //從前往後數找到第一個比temp大的,這裏一定要<=,不然如果數組中有相同的會出現stackOverFlow錯誤
                      low++;
                  }
                  number[high]=number[low];  //把那個大的數字放到high的位置上
              }
              number[low]=temp;       //將中軸數放到low或者high上,此時low應等於high
              return low;
          }
  • 插入排序

    • 基本思想

    每步將一個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從後向前找到合適位置後),直到全部插入排序完爲止。

    img

    代碼實現思路

    • 從第一個元素開始,該元素可以認爲已經被排序
    • 取出下一個元素,在已經排序的元素序列中從後向前掃描
    • 如果該元素(已排序)大於新元素,將該元素移到下一位置
    • 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
    • 將新元素插入到該位置中
    • 代碼實現

      //插入排序
          public static void insertSort(int number[]){
              for(int i=0;i<number.length;i++){
                  int temp=number[i];
                  int j;
                  for(j=i;j>0&&number[j-1]>temp;j--){
                      number[j]=number[j-1];
                  }
                  number[j]=temp;
              }
          }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章