排序總結

對數組排序的三種通用方法:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

交換排序Exchange

選擇排序Selection

插入排序Insertion

我們通過一疊撲克牌形象地理解以上三種方法。

用交換方法對撲克牌排序時,把撲克牌攤在桌上,花色朝上然後交換順序已亂的牌,直到一副牌都有序爲止。

 

用選擇方法對撲克牌排序時,把牌攤在桌上,把數值最小的牌抽出,放在手中。然後在剩餘牌中再找到最小者,把其放在手中,如此繼續到桌上無牌時,手中的牌就排好序了。

 

用插入方法對撲克牌排序時,把牌都拿在手中,每次從手中取一張放在桌上,每次放到桌上時,都插入適當位置,如此繼續,手中無牌時,桌上的一副牌就變成有序的了。

 

交換排序中,最著名(也是最聲名狼藉)的排序似乎冒泡排序,出名在於名字形象且操作簡單,其名聲狼藉在於它是目前最差的排序之一。兩個for循環重複了指定的次數,外部循環執行n-1次,內部循環執行你n/2次。

 

選擇排序中,先選擇最小的元素並將其與第一元素交換,然後在剩餘n-1個元素中選擇最小者並與第二個元素交換等等,

不幸的是和冒泡算法一樣,,外部循環執行n-1次,內部循環執行你n/2

 

插入排序,與冒泡和選擇排序不同,插入排序的比較次數與被排表的初始排列有關。如表是完全有序的,比較次數爲n-1,否則按n平方次序列排序。

 

快速排序基於交換排序,與基於交換排序的冒泡排序相比,其效果是令人吃驚的。

 

快速排序的基本思想是分區。一般過程是先選一個稱爲比較數的值,然後把數組分成兩段。大於或等於分區值的元素都放在一邊,小於分區值的元素都放另一邊。然後對兩段用遞歸排序。

 

快速排序算法如下:

 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace ConsoleApplication1
  5. {
  6.     class DataStructDemo
  7.     {
  8.        public static void QuickSort(int [] items, int left, int right){
  9.            int i,j,x,y;
  10.            i=left;
  11.            j=right;
  12.            x=items[(left+right)/2];
  13.         do
  14.         {
  15.             while ((items[i] < x) && (i < right))
  16.                 i++;
  17.             while ((items[j] > x) && (j > left))
  18.                 j--;
  19.             if (i <= j)
  20.             {
  21.                 y = items[i];
  22.                 items[i] = items[j];
  23.                 items[j] = y;
  24.                 i++;
  25.                 j--;
  26.             }
  27.         } while (i <= j);
  28.                  if(left<j)QuickSort(items,left,j);
  29.                  if(right>i)QuickSort(items,i,right);
  30.          }
  31.              
  32.         [STAThread]
  33.         static void Main(string[] args)
  34.         {
  35.             int[] arr ={ 2, 4, 65, 76, 87, 90, 56, 89, 78 };
  36.             QuickSort(arr, 0, arr.Length - 1);
  37.             Console.WriteLine(" Quick Sort Test!!!");
  38.             for (int i = 0; i < arr.Length; i++)
  39.             {
  40.                 Console.WriteLine(arr[i]);
  41.             }
  42.         }
  43.     }
  44. }

 

該例中,x=items[(left+right)/2]值爲87,當第一次

 
  1. do
  2.         {
  3.             while ((items[i] < x) && (i < right))
  4.                 i++;
  5.             while ((items[j] > x) && (j > left))
  6.                 j--;
  7.             if (i <= j)
  8.             {
  9.                 y = items[i];
  10.                 items[i] = items[j];
  11.                 items[j] = y;
  12.                 i++;
  13.                 j--;
  14.             }
  15.         } while (i <= j);

 這段代碼執行完畢後,i值爲6j值爲5,執行的結果爲

2,   4  65  76  78  56  90  89  87

 

中間過程爲

2,  4  65  76  87  90  56  89  78

 

 2   4  65  76  78  90  56  89  87

 

 

 2   4  65  76  78  90  56  89  87

 

2,   4  65  76  78  56  90  89  87

這時j左邊及i右邊被分成了兩段,左段都比x=items[(left+right)/2]=87小。右段都比x=items[(left+right)/2]=87,同時if(left<j)QuickSort(items,left,j)條件滿足,if(right>i)QuickSort(items,i,right)條件也滿足,將遞歸對兩段排序。

算法最後的執行結果爲

 

 

 

 

發佈了30 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章