排序算法——直接插入排序
一、直接插入排序的基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表
也即是:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
例子代码:
#include <iostream>
#include <malloc.h>
using namespace std;
#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE];
int length;
}sqlist;
void InsertSort(sqlist *L)
{
int i,j,k=0;
int temp;
for(i=1;i<L->length;i++)
{
temp=L->r[i];
for(j=i-1;j>=0&&L->r[j]>temp;j--)
{
L->r[j+1]=L->r[j];
}
L->r[j+1]=temp;
cout<<"i="<<i<<endl;
for(k=0;k<L->length;k++)
{
cout<<L->r[k]<<' ';
}
cout<<endl;
}
}
void main()
{
int i,cout=0;
int a[]={9,8,7,6,5,4,3,2,1,0};
sqlist *L;
L=(sqlist *)malloc(sizeof(sqlist));
for(i=0;i<10;i++)
{
L->r[i]=a[i];
cout++;
}
L->length=cout;
//cout<<"原数组数据顺序:"<<endl;
for(i=0;i<10;i++)
cout<<L->r[i]<<' ';
//cout<<"每一趟排序结果:"<<endl;
InsertSort(L);
}
从空间复杂度上来看,它只需要一个记录的辅助空间。因此关键是看它的时间复杂度。
当最好的情况,也就是要排序的表本身就是有序的,那么我们共比较了 次,因此没有移动的记录,时间复杂度为O(n)。
当最坏的情况,即待排序表是逆序的情况比如{9,8,7,6,5,4,3,2,1,0},此时需要比较 次,而记录的移次数也达到最大值 次。
如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次约为n2/4 次。因此,我们得出直接插入排序法的时间复杂度为O(n2)。从这里也看出,同样的O(n2)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。