數據結構之排序再學習

冒泡排序

這是一種穩定的排序算法

//簡單排序之冒泡排序
//時間複雜度:最好:原來就是順序的 T = O(N)
//            最壞:原來是逆序的 T = O(N*N)
 public  int[] BubbleSort(int[] A,int n)
{
   int flag = 0;
   for (int p = n - 1; p >= 0; p--) 
   {
       flag = 0;
       for (int i = 0; i < p; i++) 
       {
           if (A[i] > A[i + 1]) //一趟冒泡
           {
               A[i] = A[i] + A[i + 1];
               A[i + 1] = A[i] - A[i + 1];
               A[i] = A[i] - A[i + 1];
               flag = 1; //標識發生了交換
           }  
       }
       if (flag == 0) //全程無交換
       {
           break;
       }
   }
   return A;
} 

插入排序

這是一種穩定的排序算法

//簡單排序之插入排序
//時間複雜度:最好:原來就是順序的 T = O(N)
//          最壞:原來是逆序的 T = O(N*N)
public int[] InsertionSort(int[] A, int n)
 {
      int temp = 0;
      int i = 0;
      for (int p =1; p < n; p++)
      {

          temp = A[p]; //摸下一張牌
          for ( i = p; i > 0 && A[i-1]> temp; i--)
          {
                  A[i] = A[i - 1]; // 移出空位
          }
          A[i] = temp; // 新牌落位
      }
      return A;
  } 

相關概念-逆序對(inversion)

對於下標i<j,,如果i<j,如果A[i]>A[j],則稱(i,j)是一對逆序對(inversion)。

定理:任意N個不同元素組成的序列平均具有N(N-1)/4個逆序對。
定理:任意僅以交換相鄰輛元素來排序的算法,其平均時間複雜度爲O(N*N )。


希爾排序

這是一種穩定的排序算法

public int[] ShellSort(int[] A, int n)//原始希爾排序;每次都是取一半的間距
{
      int temp = 0;
      int i = 0;
      int d = 0;
      for (d = n / 2; d > 0; d /=2)
      {
          for (int p = d; p < n; p++)
          {

              temp = A[p]; //摸下一張牌
              for (i = p; i > d && A[i - d] > temp; i-=d)
              {
                  A[i] = A[i - d]; // 移出空位
              }
              A[i] = temp; // 新牌落位
          }
       }
      return A;
  } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章