1、簡介
選擇排序是排序中比較簡單的一種,實現的大致思路如下:首先我們拿到一個需要排序的數組,假設該數組的第一個元素是最小的,然后將數組中剩下的元素,於最小的元素進行比較,如果中間有比第一個元素的小的,那么設當前元素為最小的,然后剩下的元素在和當前元素進行比較,直到找到最小的.這時候第一輪循環結束,我們可以找到當前數組中最小的那個元素,在和第一個元素交換位置.第二輪循環開始,這個時候我們以及確定第一個元素是最小的,所以這輪循環第一個元素將不參與運算.這輪循環,假設第一個元素是最小的,剩下的步驟和第一輪一樣.
2、C#實現
代碼如下:
/// <summary> /// 選擇排序 /// </summary> public class SelectctionSort { static void Main(string[] args) { var arr = new IComparable[] { 7,3,5,1,2,89,8 }; var result= Sorted(arr); Array.ForEach(arr, Console.WriteLine); Console.WriteLine("排序是否成功?{0}", IsSorted(result) ? "是" : "否"); Console.ReadKey(); } /// <summary> /// 選擇排序Main方法 /// </summary> /// <param name="array"></param> /// <returns></returns> public static IComparable[] Sorted(IComparable[] array) { int count = array.Length; for (int i = 0; i < count; i++) { //假設每一輪外循環的第一個是最小的 int min = i; for (int j = i + 1; j < count; j++) if (Less(array[j], array[min])) min = j; Exchange(array, i, min); } return array; } /// <summary> /// 判斷兩個元素的大小 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> private static bool Less(IComparable a, IComparable b) { var res = a.CompareTo(b); return res < 0; } /// <summary> /// 交換一輪循環后的結果 /// </summary> /// <param name="array"></param> /// <param name="i"></param> /// <param name="min"></param> private static void Exchange(IComparable[] array,int i,int min) { var temp = array[i]; array[i] = array[min]; array[min] = temp; } /// <summary> /// 判斷排序是否正確 /// </summary> /// <param name="array"></param> /// <returns></returns> private static bool IsSorted(IComparable[] array) { for (int i = 1; i < array.Length; i++) { if (Less(array[i], array[i-1])) return false; } return true; } }
總結:內循環,負責找出這輪循環中最小的元素,外循環負責將內循環最小的元素與本輪循環中第一個元素進行交換位置,並確保下一輪外循環第i(外循環的當前索引)小的元素不參與下一輪的比較.流程圖大致如下:
每一輪外循環i(假設有i個元素)都推舉出第i小的元素,將它和第一個元素交換位置,直到所有的元素排序完畢!
重點:
通過代碼和圖可以推算出選擇排序一共會進行N次交換(哪怕數組是有序的,通過觀察代碼可以發現),一共會進行(N-1)+(N-2)+(N-3)+.....+2+1(標准的等差數列,計算方式自行百度)等於N^2/2次比較.
優缺點分析:
移動數據很少,成線性關系即y(交換次數)=x(數組長度)
比較次數過多,成指數關系,隨着元素的個數增多,開銷指數級增大 y(比較次數)=n(數組長度)^2/2
所以,數組元素過多時,不建議使用.