1、冒泡排序
定义:冒泡排序是一种交换排序,他的基本思想是:两两比较相邻记录的数,如果反序则交换,直到没有反序的记录为止。
/// <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; /* 插入当前位置 */
}
}
待继...