選擇排序是一種低效的排序演算法,大致過程是:遍歷陣列的每一個元素,先假設0號位置上的元素是最小的,並把0號索引賦值給一個表示最小元素索引的變數,比如說是smallest,再遍歷0號位置以後的元素,一旦發現有比0號位置元素更小的元素,就把該元素的索引賦值給smallest,繼續遍歷,最終把0號位置以後最小元素的索引賦值給了smallest變數,再把0號位置和smallest位置上的元素互換,這樣,在0號位置上放上了最小元素。接著,在1號位置放上倒數第二小的元素,在2號位置放上倒數第三小的元素......以此類推,最終得到一個升序排列的陣列。由於是依次迴圈遍歷陣列元素,個人更願意把選擇排序理解成線性排序。
自定義一個類,裡面維護著一個int[]型別陣列,通過建構函式定義陣列長度並初始化,並提供了列印和選擇排序的相關方法。
public class MyArray{private static int[] arr;private static Random r = new Random();public MyArray(int size){arr = new int[size];for (int i = 0; i < size; i++){arr[i] = r.Next(1, 100);}}//選擇排序演算法
public void Sort(){int smallest; //最小元素的索引//最後一個索引位置不需要遍歷,因為在程式碼段的內部迴圈中包含了對最後一個索引位置的處理
for (int i = 0; i < arr.Length - 1; i++){//把當前遍歷的元素的索引賦值給smallest,即假設當前遍歷的陣列元素為最小元素
smallest = i;//遍歷當前遍歷元素後面的所有元素
//獲取最小元素的索引
for (int index = i + 1; index < arr.Length; index++){if (arr[index] < arr[smallest])
{smallest = index;}}//把當前遍歷元素和最小元素交換位置
Swap(i, smallest);//每次排完序列印
Print();}}//交換2個位置上的元素
public void Swap(int first, int second){int temp = arr[first];
arr[first] = arr[second];arr[second] = temp;}//列印陣列元素
public void Print(){foreach (var item in arr){Console.Write(item + " ");
}Console.WriteLine("\n");
}}
客戶端呼叫。
class Program
{static void Main(string[] args){MyArray myArray = new MyArray(8);
Console.Write("排序前: ");
myArray.Print();Console.WriteLine("排序後: ");
myArray.Sort();Console.ReadKey();}}
可見,對選擇排序來說,外部迴圈進行了n-1次迭代,內部迴圈第一次進行了n-1迭代,第二次進行了n-2次迭代……以時間複雜度來說,忽略小項和常數項,選擇排序基本上是一個平方階,寫成O(n²)。
“查詢與排序”系列包括: