冒泡排序:就是兩個兩個的這個比較好理解,代碼也比較好寫出來。
它的原理就是相鄰的兩個兩個的比較,如果前面的數比后面的大,那么交換,它這個在比較完一次的時候可以得到最大的一個數,然后接着循環,每次外循環中內循環的次數比原來少一次。

#region 冒泡排序 2 /// <summary> 3 /// 冒泡排序 4 /// </summary> 5 /// <param name="list"></param> 6 /// <returns></returns> 7 public List<int> BubbleSort(List<int> list) 8 { 9 for (int i = 0; i < list.Count - 1; i++) 10 { 11 for (int j = 0; j < list.Count - 1 - i; j++) 12 { 13 if (list[j] > list[j + 1]) 14 { 15 int temp = list[j]; 16 list[j] = list[j + 1]; 17 list[j + 1] = temp; 18 } 19 } 20 } 21 return list; 22 } 23 #endregion
直接排序原理是,讓第一個元素和之后的每一個元素相互比較,如果大就交換,每次可以讓第一個元素為最小值,如圖:

#region 直接排序
/// <summary>
/// 直接排序
/// </summary>
/// <param name="list"></param>
public void SelectionSort(List<int> list)
{
for (int i = 0; i < list.Count; i++)
{
for (int j = i + 1; j < list.Count; j++)
{
if (list[i] > list[j])
{
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
}
#endregion
快速排序:貌似效率是最高的,在C#中的類庫排序就是用的它:
它的原理是:有兩個指針left和right left默認先指向 最左邊的元素 right默認指向最右邊的元素,然后把指針為left的元素定義為標准,實現在標准左邊的元素比標准小,右邊的元素比標准大,然后經過遞歸不斷的建立標准 ,而實現排序
下面是我的一些理解:
比如要排序的數組是 643581這些數,黃色代表Left指針;紅色代表right指針;藍色表示left和right重合
開始:left指向第一個元素,right指向最后一個元素

第1次:left指針和left+1比較,6>4,left指針向右移動,right不變;left的值和left+1的值互換

第2次:left指針和left+1比較,6>3,left指針向右移動,right不變;left的值和left+1的值互換

第3次:left指針和left+1比較,6>5,left指針向右移動,right不變;left的值和left+1的值互換

第4次:left指針和left+1比較,6<8,left指針不動,right向左移動;right的值和left+1的值互換

第5次:left指針和left+1比較,6>1,left指針向右移動,right不變;left的值和left+1的值互換;

發現left和right重合 ,實現6左邊的比6小,6右邊的比6大。然后重新定義
left=原來的left;right=left-1
left=left+1 與right=原來的right 接着進行下次遍歷

下面是C#代碼:
#region 快速排序
/// <summary>
/// 快速排序
/// </summary>
/// <param name="list"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public void QuickSort(List<int> list, int left, int right)
{
if (left < right)
{
int i = Division(list, left, right);
QuickSort(list, i + 1, right);
QuickSort(list, left, i - 1);
}
}
/// <summary>
///把列表按照list[left]分到左右兩邊
/// </summary>
/// <param name="list"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns></returns>
private int Division(List<int> list, int left, int right)
{
while (left < right)
{
int num = list[left];
if (num > list[left + 1])
{
list[left] = list[left + 1];
list[left + 1] = num;
left++;
}
else
{
int temp = list[right];
list[right] = list[left + 1];
list[left + 1] = temp;
right--;
}
Console.WriteLine(string.Join(",", list));
}
Console.WriteLine("--------------\n");
return left;
}
#endregion

