C#實現——十大排序演算法之選擇排序
阿新 • • 發佈:2020-10-08
# 選擇排序法
## 1.工作原理(演算法思路)
1. 給定一個待排序陣列,找到陣列中最小的那個元素
2. 如果最小元素不是待排序陣列的第一個元素,則將其和第一個元素互換
3. 在剩下的元素中,重複1、2過程,直到排序完成。
## 2.動圖演示
![選擇排序法 動圖](https://img2020.cnblogs.com/blog/2168969/202010/2168969-20201008091401878-663929114.gif)
##3.C#程式碼實現
**根據原理設計演算法:**
class Program
{
//選擇排序法
private static void chooseSort(int[] array)
{
//第一個for迴圈:每一次迴圈完成後得到的當前的最大元素都與第i位做交換
for (int i = 0; i < array.Length; i++)
{
//min為最小元素的索引
int min = i;
//第二個for迴圈:將當前的array[j]與array[min]作比較,如果array[j]更小,則替換min的當前索引
for (int j = i + 1; j < array.Length; j++)
{
if (array[min] > array[j])
{
min = j;
}
}
//當第二個for迴圈完成時,array[min]中儲存的就是當前最小元素
//將array[min]與array[i]交換
int temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
//列印輸出陣列
private static void printArray(int[] array)
{
foreach (int item in array)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}
static void Main(string[] args)
{
int[] array = new int[10] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
printArray(array);
chooseSort(array);
printArray(array);
Console.ReadKey();
}
}
**輸出結果**
![選擇排序法結果](https://img2020.cnblogs.com/blog/2168969/202010/2168969-20201008203831965-2000105952.png)
## 4.效能分析
### 1)複雜度
![選擇排序法複雜度](https://img2020.cnblogs.com/blog/2168969/202010/2168969-20201008181354522-1436047326.png)
### 2)選擇排序法特點
* **執行的比較和交換次數**
比較: N*(N-1)/2
交換: N
* **執行時間與輸入無關**
在每一次的for迴圈結束後並不能為下一次的迴圈提供有效資訊。這種性質在某些時候是一種缺陷。在陣列大小相同時,當一個幾乎已經有序的陣列使用選擇排序法花費的時間和無序陣列所花費的時間是一致的。
* **資料的移動量最少**
交換的次數和陣列的大小呈線性關係,其他的排序演算法對資料移動量都是線性對數級別或平方級