一、定义:
插入排序分为两种:直接插入排序和折半插入排序
基本的思路:
每次将一个待排序的数据,按照其大小插入到已排序好的序列中的适当位置,知道全部数据插入完成为止。
二、步骤:
假设待排序的数据都存在a[0...n-1]中,排序步骤:
1.设a[0]是长度为1的有序序列,而a[1...n-1]为长度n-1的无序序列,设一个参数i=1;
2.将a[i]与a[0...i-1]序列中的数据进行一次比较,插入到其中的适当位置(据升序降序而定),插入后形成a[0...i]的有序序列;
3.i = i+1,重复步骤2,直到i = n-1,排序完成。
三、C语言实现:
/// <summary>
/// 插入排序
/// </summary>
/// <param name="unsorted"></param>
static void insertion_sort(int[] unsorted)
{
for (int i = 1; i < unsorted.Length; i++)
{
if (unsorted[i - 1] > unsorted[i])
{
int temp = unsorted[i];
int j = i;
while (j > 0 && unsorted[j - 1] > temp)
{
unsorted[j] = unsorted[j - 1];
j--;
}
unsorted[j] = temp;
}
}
}
当然还可以进行简化,借助换位函数封装代码:
void Insertsort(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
Swap(a[j], a[j + 1]); //换位函数
}
四、总结:
假如数组已经使有序的,那么每次插入一个数据只需考虑该数据最终位置之前的数据,那么插入的时间复杂度是O(N),但是一般都是对无序的数据进行排序,即最坏的情况时间复杂度为O(N^2)。