插入排序算法的讲解和实现
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序,时间复杂度为O(n²),且是稳定的排序算法.
这里要注意,我们说的O(n²)是指最坏时间复杂度,如果这个数组整体本来是有序的,这属于最好情况,这时候的时间复杂度就是O(n),因为不需要交换了。所以相对于冒泡排序来说,插入排序的算法还是要好一些的
动图演示:


//插入排序,时间复杂度为O(n²),且是稳定的排序算法
static void InsertSort(int[] array)
{ //将数组分为两组,一组是已经排好序的(我们称为A组)另一组是还没有排好序的(称为B组)
//在数组的刚开始,我们把数组的第一个元素array[0]将入A组,剩下的放入B组
//从数组的第二个元素开始,逐步与A组的元素相比较(从A组的后边往前边比较)
for (int i = 1; i < array.Length; i++)
{
int ivalue = array[i];//定义ivalue存储要插入的值
bool isInsert = false;//定义一个bool标志位作为判断是否已经插入
for (int j = i-1; j >=0; j--)//逐步与A组的元素相比较(从A组的后边往前边比较)
{
if(array[j]>ivalue)//如果A组中的值大于要比较的值,A组就整个数组往后移动一个位置
{
array[j + 1] = array[j];
//这样的移动当然会覆盖A组后边的那个元素的值,
//但是别忘了A组后边的那个元素,是要插入的值原本的位置,
//所以往后移动只会覆盖这个位置,不会对整个数组产生影响
}
else//如果ivalue小于等于array[j],就不用继续移动了
{
array[j + 1] = ivalue;//此时ivalue就插入在了这个不比它大的元素(array[j])的后边,即array[j+1]
isInsert = true;//标志位为true
break;
}
}
if(isInsert==false)//如果所有的A组数据都比较完了还没有插入,说明ivalue最小了,放在数组最开头
{
array[0] = ivalue;
}
}
}
static void Main(string[] args)
{
int[] array = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
InsertSort(array);
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i] + " ");
}
Console.ReadKey();
}
7万+

被折叠的 条评论
为什么被折叠?



