2025-05-23

package cn.by.Struct.Sort;
public class Sort {
 /**
  *  插入排序    
  *  
  *  基本思想:
  *  每一趟將一個待排序的記錄,按其關鍵字值的大小插入到已經排序的
  *  部分文件中適當位置上,直到全部插入完成。                         
  */
 
 /**
  * 直接插入排序(插入法)
  *
  * 逐個將紀錄插入到已排好次序的有序表中得到一個新的有序表.
  *
  */
 public static void  chaSort(int[] table) {
  int i,j;
  int shao;//哨兵位
  for(i = 1; i < table.length; i++) {//要從下標為1的元素開始
  
   shao = table[i];//每次把當前元素賦給哨兵位
   j = i – 1;//j每次為有序表的最後一個元素,哨兵位要從它開始比起
  
   while(j >= 0 && shao < table[j]) {//控制邊界,大小判斷找到位置
    table[j + 1] = table[j];//元素後移,以便空出一個位置插入shao
    j–;//下一次循環   
   }
   table[j + 1] = shao;//找到位置,插入shao,為什麼是j+1呢?因為在while退出的
   //時候,j的位置是指向小於或等於shao的元素,所以shao的位置j要加1
     
  }
 
 }
 
 
 /**
  * 希爾(shell)排序
  *
  * 基本思想:
  *
  * 把記錄按下標的一定增量d分組,對每組記錄采用直接插入排序方法進行排序,隨著增量逐漸減小,所分成的組包
  * 含的記錄越來越多,當增量的值減小到1時,整個數據合成為一組,構成一組有序記錄,則完成排序。
  *
  * @param table
  * @param n 元素個數
   */
 public static void shellSort(int table[], int n) {
 
  int i;
  int j;
  int shao;//哨兵位
  int gap = n/2;//初始增量為長度減1
  while(gap > 0) {
  
   for(i = gap; i < n; i++) {//對所有相隔gap位置的所有元素進行排序
    shao = table[i];//每次把當前元素賦給哨兵位
    j = i – gap;//j每次為有序表的最後一個元素,哨兵位要從它開始比起
    while(j >= 0 && shao < table[j]) {//對相隔gap位置的元素組進行排序
     table[j + gap] = table[j];//元素後移,以便空出一個位置插入shao
     j = j – gap;//下一次循環
    }
   
    table[j + gap] = shao;//找到位置,插入shao,為什麼是j+gap呢?因為在while退出的
    //時候,j的位置是指向小於或等於shao的元素,所以shao的位置j要加gap
   }
   gap = gap/2;//
  }
  
 
 }
 
 /**
  * 選擇排序
  *
  * 基本思想:
  * 每步從待排序的記錄中選出關鍵字最小的記錄,按順序放在已排序的記錄序列的最後,
  * 直到全部排完為止。
  *                       
  */
 /**
  * 直接選擇排序
  *
  * 進行n-1趟,每一趟逐個與剩餘元素比較,找到小的就與之交換。
  */
 public static void selectSort(int table[]) {
 
  int temp;//用於交換
 
  for(int i = 0; i < table.length – 1; i++) {
   for(int j = i + 1; j < table.length; j++ ){
    if(table[i] > table[j]) {
     temp = table[i];
     table[i] = table[j];
     table[j] = temp;
    }
    
   }
  }
 
 }
 
 
 
 
 
 
 
 
 
 
 
 /**
  *交換排序
  * 
  *基本思想:
  *兩兩比較待排序記錄的關鍵字,並交換不滿足次序要求的那些偶對,直到全部滿足為止。                              
  */
 
   /**
    *冒泡排序 
    *
    *相鄰之間相比較.n個元素要進行n-1趟。每趟要比較n減該趟(當前趟)次。
    *
    *從後向前冒,冒出最小的數
    *@param   array 要查的一個數組
    *@return  無返回值
    */
 public static void maoSort(int[] table) {
  /**
   *主要用於提前結束比較,即如果一趟中沒有一個元素交換, 則後面還沒有進行的趟也不用進行瞭。
   */
  int exchange;
  // 臨時交換變量
  int temp;
  for (int i = 1; i <= table.length – 1; i++) {//要走的趟數
   exchange = 0; // 初始值為0
   for (int j = table.length – 1; j > i – 1; j–)//每趟要交換的次數
    if (table[j] < table[j – 1]) {
     temp = table[j];
     table[j] = table[j – 1];
     table[j – 1] = temp;
     exchange = 1; // 如有交換則更改為1
    }
   // 提前結束
   if (exchange == 0)
    return;
  }
 }
 
     /**
      *快速排序:
      *
      *通過一趟排序將待排序記錄分割成獨立的兩部分,
      *其中一部分記錄的關鍵字均比另一部分的關鍵字小,再分別
      *對這兩部分記錄繼續進行排序,以達到整個序列有序。
      *
      *@param  table-待排序數組
      *@param  begin-待排序的起始源點
      *@param  end-待排序的終止點    
      */    
     public static void quickSort(int []table, int begin, int end) {
     
      //異常處理,待排序的起始源點不能小於0且不能大於待排序的終止點
       if((begin < 0) || (begin > end))
       return;
      
       int i = begin;
       int j = end;
       int tem;
       //存放界點,用區間的第一個元素作基準
      tem = table[begin]; 
     
      //從區間兩端交替向中間掃描,直至i=j為止
       while(i != j) {
       
         //從右向左掃描,找第一個小於tem的元素       
         while((j > i) && table[j] > tem)
           j–;        
        
         //從左向右掃描,找第一個大於tem的元素
         while((i < j) && table[i] < tem)
           i++;
          
         //滿足條件交換         
         if(i < j) {
           int change;
           change = table[j];
           table[j] = table[i];
           table[i] = change;
         }      
       }
      
       //分成兩部分記錄
       table[i] = tem;
       //對界點前部分記錄排序
      quickSort(table, begin, i – 1);
      //對界點後部分記錄排序    
      quickSort(table, i + 1, end);
     } 
  
 
    
 
}
 
本文出自 “Enthusiasm   10年” 博客

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *