C# 插入排序的概念
插入排序是一种简单直观的排序算法,它的基本思想是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置。
插入排序背景
插入排序的时间复杂度为O(n^2),空间复杂度为O(1),相对来说比较高。但是它的实现比较简单,容易理解。
插入排序是由美国计算机科学家Donald Shell发明的,也因此又被称为Shell排序。
插入排序适用于简介:
小规模数据排序:插入排序在小规模数据(例如10个以下)的排序中表现良好,由于其简单直观的实现和较低的时间复杂度常数,插入排序在这种情况下往往比其他更复杂的排序算法(如快速排序或归并排序)更快。
需要注意的是,对于大规模数据的排序,插入排序的效率较低,因为它的时间复杂度为O(n^2),而其他高效的排序算法(如快速排序、归并排序、堆排序)具有更低的时间复杂度。因此,在处理大规模数据的排序时,通常会选择更适合的排序算法。
插入排序的应用场景
- 扑克牌排序:在玩扑克牌时,把手中的牌按照数字大小插入到已有的牌中,使得手中的牌始终保持有序。
- 考试成绩排序:对一组考试成绩进行排序,将新的成绩插入到已有的成绩中,以便按照从高到低的顺序展示排名。
- 单词排序:对一组单词进行排序,将新的单词插入到已有的单词中,以便按照字母顺序展示。数组排序:对一个无序数组进行排序,将新的元素插入到已有的元素中,使得整个数组有序。
插入排序实现方式 1:
int[] arr = { 123, 12, 345, 65, 56 };
for (int i = 3; i < arr.Length; ++i)
{
int key = arr[i];
int j = i - 1;
// 将 arr[0..i-1] 中大于 key 的元素向后移动一位
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j = j - 1;
//数据整理,循环出比key大的数值互换位置
}
arr[j + 1] = key;
}
for (int q = 0; q < arr.Length; q++)
{
Console.WriteLine(arr[q]);
}
插入排序实现方式 2:
int[] arr = { 123, 12, 345, 65, 56 };
for (int i = 1; i < arr.Length; i++)
{
int temp = arr[i];
//从当前元素的前一个元素开始(j = i - 1),如果该元素大于temp,则将该元素后移一位,即将arr[j]赋值给arr[j + 1]。
//然后,继续向前比较,直到找到小于或等于temp的元素,或者已经到达子数组的起始位置(j < 0)。
for (int j = i - 1; j >= 0; j--)
{
if (arr[j] > temp)
{
arr[j + 1] = arr[j];
arr[j] = temp;
}
else
break;
}
}
for (int q = 0; q < arr.Length; q++)
{
Console.WriteLine(arr[q]);
}
运行结果: