在我所學的知識中,C#有三種常見的排序方法,各有千秋,我對他們簡單做了一個總結,如下:
1、交換排序
假設有一個數組nums,長度為5,要對它進行升序排序,交換排序總體思路是:
- 在下標0-4范圍內,將該范圍內最小的數字提到下標0
- 在下標1-4范圍內,將該范圍內最小的數字提到下標1
- 在下標2-4范圍內,將該范圍內最小的數字提到下標2
- 在下標3-4范圍內,將該范圍內最小的數字提到下標3
- 排序完成!
寫成代碼就應該是:
for (int i = 0; i < 4; i++) { //在 i-4 范圍內,將該范圍內最小的數字提到i }
不管nums的長度是多少,都可以使用這樣的代碼格式:
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 范圍內,將該范圍內最小的數字提到i }
那如何把i-(nums.Length-1)范圍內的最小數字提到位置i呢?
在這個問題上,交換排序使用以下方式完成:
- 將位置i和位置i+1進行比較,如果比i+1大,則交換
- 將位置i和位置i+2進行比較,如果比i+2大,則交換
- ……
- 將位置i和位置nums.Length-1進行比較,如果比nums.Length-1大,則交換
因此,代碼如下:
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 范圍內,將該范圍內最小的數字提到i for (int j = i + 1; j < nums.Length; j++) { if (nums[i] > nums[j]) { //交換 int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } }
2、冒泡排序
冒泡排序有兩種思路:
- 將最大的數沉到底部
- 將最小的數冒到頂部
這里介紹的是將最大的數沉到底部這種思路。
假設有數組nums,長度為5,要對它進行升序排序,冒泡排序總體思路是:
- 在下標0-4范圍內,將該范圍內的最大數字沉到位置4
- 在下標0-3范圍內,將該范圍內的最大數字沉到位置3
- 在下標0-2范圍內,將該范圍內的最大數字沉到位置2
- 在下標0-1范圍內,將該范圍內的最大數字沉到位置1
- 排序完成!
寫成代碼就應該是:
for (int i = 4; i > 0; i--) { //在 0-i 范圍內,將該范圍內最大的數字沉到i }
不管nums的長度是多少,都可以使用這樣的代碼格式:
for (int i = nums.Length - 1; i > 0; i--) { //在 0-i 范圍內,將該范圍內最大的數字沉到i }
那如何把0-i范圍內的最大數字沉到位置i呢?
在這個問題上,冒泡排序使用以下方式完成:
- 將位置0和位置1進行比較,如果前者比后者大,則交換
- 將位置1和位置2進行比較,如果前者比后者大,則交換
- ……
- 將位置i-1和位置i進行比較,如果前者比后者大,則交換
因此,代碼如下:
for (int i = nums.Length - 1; i > 0; i--) { //在 0-i 范圍內,將該范圍內最大的數字沉到i for (int j = 0; j < i; j++) { if (nums[j] > nums[j+1]) { //交換 int temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } }
3、選擇排序
選擇排序的總體思路和交換排序的總體思路相似,都是將某個范圍內的最小數提到該范圍內的第一位,它的代碼結構跟交換排序也是完全相同的:
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 范圍內,將該范圍內最小的數字提到i }
知識在實現注釋部分產生了差異,選擇排序的思路是:
- 首先找到 i - (nums.Length-1) 范圍內的最小數所在的下標,假設找到的下標保存到變量index中
- 然后將nums[i]和nums[index]的值交換
因此,使用選擇排序實現注釋部分的代碼如下:
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 范圍內,將該范圍內最小的數字提到i //1. 首先找到 i - (nums.Length-1) 范圍內的最小數所在的下標 int index = i; //先假設最小數的下標是i for (int j = i + 1; j < nums.Length; j++) { if (nums[j] < nums[index]) { //發現了更小的數 index = j;//記錄下標 } } //2. 然后將nums[i]和nums[index]的值交換 int temp = nums[i]; nums[i] = nums[index]; nums[index] = temp; }