插入排序

来源:互联网 发布:学单片机需要哪些软件 编辑:程序博客网 时间:2024/04/29 23:10

 1.直接插入排序

(1)一般算法基本思想

 在当前有序区R[1...i-1]中查找R[i]的正确插入位置k;将R[K...i-1]中记录均后移一位,腾出k位置上的空间插入R[i].(这里采用升序排列)

(2)改进型算法

将插入记录R[I]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2..,1)的关键字比较;如果R[j]的关键字大于R[i]的关键字,则R[j]后移一位;如果R[j]的

关键字小于或等于R[i]的关键字,则查找结束,(j+1)即为R[I]的插入位置

c语言描述

void InsertSort (SqList &L)

{

       for(i=2;i<=L.length; ++i)//0号元素为临时数据,从2号元素开始遍历

       if(LT(L.r[i].key, L.r[i-1].key))//第i元素小于第i-1元素

{

       L.r[0] =L.r[i];//将小数放到0号位置

       L.r[i] =L.r[i-1];//将第i-1元素放到第i位置

       For(j=i-2;LT(L.r[0].key,L.r[j].key); --j)//倒着遍历从i-2位置开始和0号元素比较

       {

              L.r[j+1] = L.r[j];//将元素后移

}

L.r[j+1] = L.r[0];//找到0号元素可以放下的位置,将0号元素填进去

}

}

实例:

#include<iostream.h>


void insert_sort(int a[],int n)
{
 int i,j,temp;

 for(i=1;i<n;i++)
 {
  temp=a[i];
  for(j=i-1;j>=0 && temp<=a[j];j--)
  {
   a[j+1]=a[j];
  }
  a[j+1]=temp;
 }
}

void printf_array(int a[],int n)
{
 int i;
 for(i=0;i<n;i++)
 {
  cout<<a[i]<<" ";
 }
 cout<<endl;
}
int main(void)
{
 int a[]={6,5,32,21,52};
 printf_array(a,5);
 insert_sort(a,5);
 printf_array(a,5);

 return 0;
}

 

2.希尔(shell)排序

基本思想:先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列“基本有序”时,

在对全体记录进行一次直接插入排序。

 

3. 折半排序

void BInsertSort (SqList & L)

{

       for( i=2 ;i<=L.length;++i)//遍历数组

       {

              L.r[0] = L.r[i];//记录比较数据

              Low =1;//low初始化为数组起始

high =i-1;//high初始化为数据末尾

              while(low<=high)//没有比较完毕

              {

                     m = (low + high)/2;//取一半的数

                     if(LT(L.r[0].key,L.r[m].key)) high =m-1;//如果待比较数小于折半的数

                     else low=m+1;//折半的数小于待比较数

              }

              for( j=i-1;j>=high+1;--j)//从high+1开始的数据后移

{

              L.r[j+1] =L.r[j];

}

L.r[high+1] =L.r[0];//将0位置的数放入指定位置

}

}

4 表插入排序

基本思想:使用静态链表(数据+位置),只修改静态链表的位置指针

void LInsertionSort(Elem SL[],int n)

{

SL[0].key=MAXINT;

SL[0].next=1;

SL[1].next=0;

for(i=2;i<=n;++i)//遍历整个数组

{

for(j=0,k=SL[0].next;SL[k].key<=SL[i].key;j=k,k=SL[k].next)//遍历静态链表寻找可插入的位置

{

SL[j].next=i;

SL[j].next=k;

}

}

}

void Arrage(SLinkListType &SL)

{

p=SL.r[0].next;

for(i=1;i<SL.length;++i)

{

while(p<i)

p=SL.r[p].next;

q=SL.r[p].next;

if(p!=i)

{

SL.r[p]<--->SL.r[i];

SL.r[i].next=p;

}

p=q;

}

}

 

 

 

原创粉丝点击