對數組排序的三種通用方法:<?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平方次序列排序。
快速排序基於交換排序,與基於交換排序的冒泡排序相比,其效果是令人吃驚的。
快速排序的基本思想是分區。一般過程是先選一個稱爲比較數的值,然後把數組分成兩段。大於或等於分區值的元素都放在一邊,小於分區值的元素都放另一邊。然後對兩段用遞歸排序。
快速排序算法如下:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace ConsoleApplication1
- {
- class DataStructDemo
- {
- public static void QuickSort(int [] items, int left, int right){
- int i,j,x,y;
- i=left;
- j=right;
- x=items[(left+right)/2];
- do
- {
- while ((items[i] < x) && (i < right))
- i++;
- while ((items[j] > x) && (j > left))
- j--;
- if (i <= j)
- {
- y = items[i];
- items[i] = items[j];
- items[j] = y;
- i++;
- j--;
- }
- } while (i <= j);
- if(left<j)QuickSort(items,left,j);
- if(right>i)QuickSort(items,i,right);
- }
- [STAThread]
- static void Main(string[] args)
- {
- int[] arr ={ 2, 4, 65, 76, 87, 90, 56, 89, 78 };
- QuickSort(arr, 0, arr.Length - 1);
- Console.WriteLine(" Quick Sort Test!!!");
- for (int i = 0; i < arr.Length; i++)
- {
- Console.WriteLine(arr[i]);
- }
- }
- }
- }
該例中,x=items[(left+right)/2]值爲87,當第一次
- do
- {
- while ((items[i] < x) && (i < right))
- i++;
- while ((items[j] > x) && (j > left))
- j--;
- if (i <= j)
- {
- y = items[i];
- items[i] = items[j];
- items[j] = y;
- i++;
- j--;
- }
- } while (i <= j);
這段代碼執行完畢後,i值爲6,j值爲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)條件也滿足,將遞歸對兩段排序。
算法最後的執行結果爲