定義:冒泡排序是一種交換排序,他的基本思想是:兩兩比較相鄰記錄的數,如果反序則交換,直到沒有反序的記錄爲止。
/// <summary>
/// 改進冒泡算法
/// </summary>
/// <param name="nums"></param>
/// <returns></returns>
static void BubbleSort(int[] nums)
{
bool flag = true;
// 第一層:比較趟數(n-1)
for (int i = 0; i < nums.Length -1 && flag ; i++) /* 若flag爲false,退出循環,排序結束 */
{
flag = false; /* 排序前,重置爲false */
// 第二層:兩兩相鄰比較,交換排序
for (int j = nums.Length - 1; j > i; j--)
{
// 小數向前排(一趟交換多次)
if (nums[j] < nums[j - 1])
{
int temp = nums[j];
nums[j] = nums[j - 1];
nums[j - 1] = temp;
flag = true; /* 如果有數據交換,標識爲true, 繼續排序*/
}
}
//Console.Write((i + 1) + "趟" + " ");
}
//Console.WriteLine();
}
2、選擇排序
思想:將序列劃分爲無序和有序兩個子序列,尋找無序序列中的最小(大)值和無序序列的首元素交換,有序區擴大一個,循環下去,最終完成全部排序。
/// <summary>
/// 選擇排序(相比冒泡優在減少了交換次數,總體性能優於冒泡)
/// </summary>
/// <param name="nums"></param>
/// <returns></returns>
static void SelectSort(int[] nums)
{
int min = 0;
// 第一層:選擇趟數(n-1)
for (int i = 0; i < nums.Length - 1; i++)
{
min = i; /* 將當前下標定義爲最小值下標 */
// 第二層:選出最小值下標
for (int j = i + 1; j < nums.Length; j++)
{
if (nums[j] < nums[min]) /* 如果有小於當前最小值 */
{
min = j; /* 更換最小值下標 */
}
}
// 交換數據(一趟只交換一次)
if (min != i)
{
int temp = nums[i];
nums[i] = nums[min];
nums[min] = temp;
}
}
}
3、插入排序
概念:將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據(假設一個key,通過不斷的比較而形成一個有序的數列)。
/// <summary>
/// 插入排序(不適合對於數據量比較大的排序應用,一般用於少量元素的排序)
/// </summary>
/// <param name="nums"></param>
/// <returns></returns>
static void InsertSort(int[] nums)
{
for (int i = 1; i < nums.Length; i++) /* 在插入排序中,可以先跳過第一個元素,從第二個元素開始 */
{
int temp = nums[i]; /* 要插入的值 */
int j = i; /* 有序序列數組元素數 */
while (j > 0 && nums[j - 1] > temp) /* 與有序序列比較,如果有序序列_當前索引_值大於要插入的值,有序序別後移 */
{
nums[j] = nums[j - 1]; /* 交換數據,後移 */
j--;
}
nums[j] = temp; /* 插入當前位置 */
}
}
待繼...