排序算法——直接插入排序

一、直接插入排序的基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增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)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。

posted @ 2011-05-23 20:37  要八戒更需悟空  阅读(619)  评论(0编辑  收藏  举报