插入排序
基本思想:每次将待排序的记录按其建的大小插入到前面已经排好序的子序列中的适当位置。直到全部记录插入完成为止。
插入排序与打扑克牌时整理手中的牌非常相似。为了简化,可加入监视哨来加快速度。
表1-1 直接插入排序的时间复杂度
初始状态 | 正序 | 反序 | 无序(平均) |
第i趟的键比较次数 | 1 | i | (i-2)/2 |
总的键比较次数 | n-1 | n(n-1)/2 | 约n^2/4 |
第i趟的记录移动次数 | 2 | i+2 | (i-2)/2 |
总的记录移动次数 | 2(n-1) | n(n-1)/2+2n | 约n^2/4 |
时间复杂度 | O(n) | O(n^2) | O(n^2) |
表1-1 直接插入排序的空间复杂度
所需辅助空间是一个监视哨,空间复杂度为O(1)。是一个就地排序,是一种稳定的排序。 |
由于有序区是顺序有序的,可以通过二分查找来确定插入位置,这种改进的插入排序就称为二分插入排序。
// insertsort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
void insert_sort(int a[], int n)
{
int i, j, temp;
for (i = 1; i < n; ++i)
{
temp = a[i];
for (j = i; j>0 && temp < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
a[j] = temp;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={46,58,15,45,90,18,10,62};
insert_sort(a,8);
return 0;
}
二分插入排序:
// binaryinsertsort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
void binary_insert_sort(int a[], int n)
{
int i, j, temp;
int left,right,middle;
for (i = 1; i < n; ++i)
{
temp = a[i];
left=0;right=i-1;
while (left<=right)
{
middle=(left+right)/2;
if (a[middle]>temp)
{
right=middle-1;
}
else
{
left=middle+1;
}
}
for (int j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=temp;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={46,58,15,45,90,18,10,62};
binary_insert_sort(a,8);
return 0;
}