官术网_书友最值得收藏!

2.5 常用排序

實例041 冒泡排序法

光盤位置:光盤\MR\02\041

高級

實用指數:

實例說明

冒泡排序是交換排序中最簡單的排序方法,其基本思想是:兩兩比較相鄰的關鍵碼,如果反序則交換,直到沒有反序的記錄為止,本實例運行結果如圖2.25所示。

圖2.25 實例運行結果

關鍵技術

對于冒泡排序,已經知道了其基本思想,下面是對于冒泡排序需要解決的關鍵問題。第一將整個記錄序列分為有序區和無序區。第二對無序區的比較,將使關鍵碼小的記錄向前移動,使關鍵碼大的向后移動,一直重復以上操作,直到無序區沒有反序的記錄。

設計過程

實現冒泡排序的關鍵代碼如下:

        package bubble;
        public class Bubble {
        public static void main(String[] args) {
        int a[]={10,23,11,56,45,26,59,28,84,79};        //給出原始數的序列
        int i, temp;
        System.out.println("初始序列的數組為:");          //輸出排序好的數序列
            for(i=0; i<10; i++){
                  System.out.print(a[i]+"  ");
            }
            for(i=0; i<9; i++){
              if(a[i]>a[i+1]){                          //進行兩兩比較,下面進行符合條件的交換
                  temp=a[i];
                  a[i]=a[i+1];
                  a[i+1]=temp;
              }
            }
            System.out.println("\n"+"排序好的數組為:");   //輸出排序好的數序列
            for(i=0; i<10; i++){
                  System.out.print(a[i]+"  ");
            }
        }
        }

秘笈心法

冒泡排序實際上就是利用一個中間變量來實現數值的交換。由于這種算法簡單易用,因此在實際開發項目過程中,經常用到這種算法。

實例042 快速排序法

光盤位置:光盤\MR\02\042

高級

實用指數:

實例說明

快速排序算法是對冒泡排序算法的一種改進,由于冒泡排序是對相鄰的數據進行兩兩比較,元素的移動次數和比較次數都比較多,而快速排序是從記錄序列的兩端向中間進行的,所以在元素的移動次數和比較次數上都減少了,本實例運行結果如圖2.26所示。

圖2.26 實例運行結果

關鍵技術

快速排序的基本思想是:首先選定一個軸值(就是比較的基準),將待排序記錄分割成獨立的兩部分,左側記錄的關鍵碼都小于或等于軸值,右側的記錄關鍵碼都大于或等于關鍵碼,然后再對這兩部分分別重復上述的過程,直到整個序列有序。

設計過程

實現快速排序一次劃分的關鍵代碼如下:

        package bubble;
              public class Parti {
              public int partition(int[] r, int first, int end){
                  int i, j;
                  i=first; j=end;                            //初始化
                  while(i<j){
                      while(i<j&&r[i]<=r[j])  j--;           //右側掃描
                            if(i<j){                         //將較小的記錄交換到前面
                                int temp;
                                temp=r[i];
                                r[i]=r[j];
                                r[j]=temp;
                            }
                      while(i<j&&r[i]<r[j]){
                            i++;                              //左側掃描
                      }
                      if(i<j){                                //將較大的記錄交換到后面
                            int temp;
                            temp=r[i];
                            r[i]=r[j];
                            r[j]=temp;
                      }
                  }
                  return i; //
            }
        }

秘笈心法

對于快速排序算法,首要解決的就是軸值的確定問題。對此最簡單的方法就是用記錄的第一個記錄作為軸值,但這樣不能保證不出現正序或逆序的問題,這樣將要對序列進行一次前后調換。所以可以取首值、中值以及末值,選取其中大小居中的作為軸值。

實例043 選擇排序法

光盤位置:光盤\MR\02\043

高級

實用指數:

實例說明

選擇排序是一類借助“選擇”進行排序的方法,其主要思想是:每趟排序在當前待排序序列中選出關鍵碼最小的記錄,添加到有序序列中。選擇排序比較獨特的地方是:記錄的移動次數少,本實例運行結果如圖2.27所示。

圖2.27 實例運行結果

設計過程

實現選擇排序的關鍵代碼如下:

        package select;
        public class Select {
        public static void main(String[] args) {
              int r[]={49,27,65,97,76,13,38,5,12,56};
              int i, j, index, temp;
              System.out.println("初始序列的數組為:");
              for(i=0; i<10; i++){                        //對n個記錄進行n-1趟的選擇排序
                  System.out.print(r[i]+"  ");
            }
              for(i=0; i<9; i++){
                  index=i;                                //初始化第i趟選擇排序的最小記錄的指針
                  for(j=i+1; j<10; j++){                  //在無序區選取最小記錄
                      if(r[j]<r[index]){
                            index=j;
                      }
                  }
                  if(index! =i){                          //將最小記錄與r[i]交換
                        temp=r[i];
                        r[i]=r[index];
                        r[index]=temp;
                  }
              }
              System.out.println("\n"+"排序好的數組為:");
              for(i=0; i<10; i++){
                  System.out.print(r[i]+"  ");
              }
        }
        }

秘笈心法

在實現選擇排序時,第一將整個記錄序列分為有序區和無序區,初始狀態有序區為空,無序區包含所有待排序的記錄;第二對無序區的比較,將使關鍵碼小的記錄與無序區的第一個記錄進行交換,一直重復以上操作,直到無序區只剩下一個記錄。

實例044 插入排序法

光盤位置:光盤\MR\02\044

高級

實用指數:

實例說明

插入排序是一類借助“插入”進行排序的方法,其主要思想是:每次將一個待排序的記錄按其關鍵碼的大小插入到一個已經排好序的有序序列中,直到全部記錄排好序,本實例運行結果如圖2.28所示。

圖2.28 實例運行結果

設計過程

實現直接插入排序的關鍵代碼如下:

        package insert;
        public class Insert {
        public static void main(String[] args) {
              int r[]={49,27,65,97,76,13,38,5,12,56};             //給出原始數的序列
              int i, j, temp, k;                                  //定義變量名稱
              System.out.println("放置初始序列的數組為:");           //輸出初始序列
              for(i=0; i<10; i++){
                  System.out.print(r[i]+"  ");
              }
              for(i=1; i<10; i++){
                  temp=r[i];
                  for(j=i-1; j>=0&&temp<r[j]; j--){              //尋找插入位置
                      r[j+1]=r[j];
                  }
                  r[j+1]=temp;                                   //大于當前值的,插到當前值后面
              }
              System.out.println("\n"+"排序好的數組為:");          //輸出新序列
              for(i=0; i<10; i++){
                  System.out.print(r[i]+"  ");
              }
        }
        }

秘笈心法

直接插入排序是插入排序中最簡單的排序方法,首先要將待排序的記錄劃分為有序區和無序區,初始時有序區為待排記錄的第一個記錄,無序區是剩下的待排序記錄。然后將無序區的第一個記錄插入到有序區的適當位置,重復操作,直到無序區中沒有記錄。

實例045 歸并排序法

光盤位置:光盤\MR\02\045

高級

實用指數:

實例說明

歸并排序是一種借助“歸并”進行排序的方法,其實就是將兩個或兩個以上的有序序列合并成一個有序的序列。歸并排序的主要思想是將若干有序序列逐步合并成一個有序的序列,本實例運行結果如圖2.29所示。

圖2.29 實例運行結果

設計過程

實現歸并排序的關鍵代碼如下:

        package guibing;
        public class MergeS {
              private static void merge(int r[], int r1[], int s, int m, int t){
                  int i=s, j=m+1, k=s;
                  while(i<=m&&j<=t){
                      if(r[i]<=r[j]){
                            r1[k++]=r[i++];                //取r[i]和r[j]中較小者放入r1[k]
                      }else{
                            r1[k++]=r[j++];
                      }
                  }
                  if(i<=m){
                      while(i<=m){                         //若第一個子序列處理完,則進行收尾處理
                            r1[k++]=r[i++];
                      }
                  }else{
                      while(j<=t){                         //若第二個子序列處理完,則進行收尾處理
                            r1[k++]=r[j++];
                      }
                  }
              }
              private static void mergePass(int r[], int r1[], int n, int h){
                  int i=0;
                  while(i<=n-2*h){                         //待歸并記錄至少有兩個長度為h的子序列
                      merge(r, r1, i, i+h-1, i+2*h-1);
                      i+=2*h;
                  }
                  if(i<n-h){
                      merge(r, r1, i, i+h-1, n);           //待歸并序列中有一個長度小于h
                  }else{
                      for(int k=i; k<=n; k++){              //待歸并序列中只剩一個子序列
                            r1[k]=r[k];
                      }
                  }
              }
              public static void mergeS(int r[], int r1[], int n){
                  int h=1;
                  while(h<n){
                      mergePass(r, r1, n-1, h);
                      h=2*h;
                      mergePass(r1, r, n-1, h);
                      h=2*h;
                  }
              }
              public static void main(String[] args) {
                  int r[]={36,45,12,56};
                  int r1[]=new int[4];
                  System.out.println("原始數列是:");
                  for(int i=0; i<r.length; i++){
                      System.out.print("  "+r[i]);
                  }
                  mergeS(r, r1, r.length);
                  System.out.println("\n"+"新數列是:");
                  for(int i=0; i<r.length; i++){
                      System.out.print("  "+r[i]);
                  }
              }
        }

秘笈心法

歸并排序中的最簡單的排序是二路歸并排序,其主要思想是:將若干個有序的序列進行兩兩歸并,直到所有記錄全部歸并到一個序列。知道了其主要思想,那么來討論一下它的過程。將有n個記錄的待排序列看成n個子序列,然后把它們兩兩歸并,接著把長度為2的n/2個子序列再次歸并,重復上述過程,直到有序為止。

主站蜘蛛池模板: 揭东县| 绵竹市| 临澧县| 苍南县| 咸阳市| 个旧市| 葵青区| 盖州市| 嵩明县| 怀柔区| 铜陵市| 建阳市| 东源县| 道孚县| 台南市| 尼勒克县| 古蔺县| 汕头市| 荔浦县| 徐州市| 高安市| 阜宁县| 大理市| 商丘市| 涡阳县| 九寨沟县| 石渠县| 青海省| 莎车县| 洛隆县| 百色市| 阳原县| 博客| 嵩明县| 汽车| 龙陵县| 安平县| 太仆寺旗| 宁德市| 临泽县| 金乡县|