在我所學的知識中,C#有三種常見的排序方法,各有千秋,我對他們簡單作了一個總結,以下:數組
假設有一個數組nums,長度爲5,要對它進行升序排序,交換排序整體思路是:spa
寫成代碼就應該是:code
for (int i = 0; i < 4; i++) { //在 i-4 範圍內,將該範圍內最小的數字提到i }
無論nums的長度是多少,均可以使用這樣的代碼格式:blog
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 範圍內,將該範圍內最小的數字提到i }
那如何把i-(nums.Length-1)範圍內的最小數字提到位置i呢?排序
在這個問題上,交換排序使用如下方式完成:class
所以,代碼以下:變量
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; } } }
冒泡排序有兩種思路:方法
這裏介紹的是將最大的數沉到底部這種思路。總結
假設有數組nums,長度爲5,要對它進行升序排序,冒泡排序整體思路是:註釋
寫成代碼就應該是:
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呢?
在這個問題上,冒泡排序使用如下方式完成:
所以,代碼以下:
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; } } }
選擇排序的整體思路和交換排序的整體思路類似,都是將某個範圍內的最小數提到該範圍內的第一位,它的代碼結構跟交換排序也是徹底相同的:
for (int i = 0; i < nums.Length - 1; i++) { //在 i-(nums.Length-1) 範圍內,將該範圍內最小的數字提到i }
知識在實現註釋部分產生了差別,選擇排序的思路是:
所以,使用選擇排序實現註釋部分的代碼以下:
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; }