C#的數組排序

在我所學的知識中,C#有三種常見的排序方法,各有千秋,我對他們簡單作了一個總結,以下:數組

一、交換排序

假設有一個數組nums,長度爲5,要對它進行升序排序,交換排序整體思路是:spa

  1. 在下標0-4範圍內,將該範圍內最小的數字提到下標0
  2. 在下標1-4範圍內,將該範圍內最小的數字提到下標1
  3. 在下標2-4範圍內,將該範圍內最小的數字提到下標2
  4. 在下標3-4範圍內,將該範圍內最小的數字提到下標3
  5. 排序完成!

寫成代碼就應該是: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

  1. 將位置i和位置i+1進行比較,若是比i+1大,則交換
  2. 將位置i和位置i+2進行比較,若是比i+2大,則交換
  3. ……
  4. 將位置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;
}
}
}

 

 

 

 

二、冒泡排序

冒泡排序有兩種思路:方法

  • 將最大的數沉到底部
  • 將最小的數冒到頂部

這裏介紹的是將最大的數沉到底部這種思路。總結

假設有數組nums,長度爲5,要對它進行升序排序,冒泡排序整體思路是:註釋

  1. 在下標0-4範圍內,將該範圍內的最大數字沉到位置4
  2. 在下標0-3範圍內,將該範圍內的最大數字沉到位置3
  3. 在下標0-2範圍內,將該範圍內的最大數字沉到位置2
  4. 在下標0-1範圍內,將該範圍內的最大數字沉到位置1
  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呢?

在這個問題上,冒泡排序使用如下方式完成:

  1. 將位置0和位置1進行比較,若是前者比後者大,則交換
  2. 將位置1和位置2進行比較,若是前者比後者大,則交換
  3. ……
  4. 將位置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;
}
}
}

 

 

 

三、選擇排序

選擇排序的整體思路和交換排序的整體思路類似,都是將某個範圍內的最小數提到該範圍內的第一位,它的代碼結構跟交換排序也是徹底相同的:

for (int i = 0; i < nums.Length - 1; i++)
{
    //在 i-(nums.Length-1) 範圍內,將該範圍內最小的數字提到i
}

 

 

 

知識在實現註釋部分產生了差別,選擇排序的思路是:

  1. 首先找到 i - (nums.Length-1) 範圍內的最小數所在的下標,假設找到的下標保存到變量index中
  2. 而後將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;
}
相關文章
相關標籤/搜索