C#的數組排序


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

1、交換排序

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

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

寫成代碼就應該是:

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呢?

在這個問題上,交換排序使用以下方式完成:

  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;
}
}
}

 

 

 

 

2、冒泡排序

冒泡排序有兩種思路:

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

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

假設有數組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;
}
}
}

 

 

 

3、選擇排序

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

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM