数据结构中,两种插入排序的C语言简单实现

1. 直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。

一般情况下,第i趟直接插入排序的操作为:在含有i-1个记录的有序数组中a[1..i-1]中插入一个记录a[i]后,变成含有i个记录的有序数组;并且为了在查找插入位置的过程中避免数组下标出界,在a[0]处设置监视哨。在自i-1起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1趟插入,即:现将数组中的第一个记录看成是一个有序的子数列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

其用C语言实现的代码如下:

#include
#include
void insertsort(int a[],int n)  
{  
   int i=0,j=0;  
   for(i=2;i   {  
       if(a[i]       { 
  a[0]=a[i];//复制为哨兵
  a[i]=a[i-1];  
          for(j=i-2;j>=0&&a[0]              a[j+1]=a[j];  //记录后移
          a[j+1]=a[0];  //插入到正确的位置
       }   
   }  
   for(i=1;i    {  
      printf("%4d",a[i]);  
    }  
    printf("\n");  

int main()
{
   int length=0;
   int a[]={0,49,38,65,97,76,13,27,49};//从1开始存入数据
   length=sizeof(a)/sizeof(a[0]);
   insertsort(a,length);
   system("pause");

   return 0;

}

2. 折半插入排序

由于插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”可利用“折半查找”来实现,由此进行的掺入排序称之为折半插入排序。其c语言实现代码如下:

#include
#include
void binsertsort(int a[],int n)  
{  
   int i=0,j=0,m;  
   for(i=2;i   {  
         a[0]=a[i];    //将a[i]暂Y存到a[0]
int low=1,high=i-1;
       while(low<=high)  //在a[low...high]中折半查找有序插入的位置
       { 
  m=(low+high)/2;//折半
 if(a[0]  else low=m+1;//插入点在高半区
       }  
         for(j=i-1;j>=high+1;--j) a[j+1]=a[j];//记录后移
a[high+1]=a[0];//插入
   }  
   for(i=1;i    {  
      printf("%4d",a[i]);  
    }  
    printf("\n");  

int main()
{
   int length=0;
   int a[]={0,49,38,65,97,76,13,27,49};//从1开始存入数据
   length=sizeof(a)/sizeof(a[0]);
   binsertsort(a,length);
   system("pause");
   return 0;

}

以上两种方法,产生的运行结果相同。

执行结果如下图所示:

数据结构中,两种插入排序的C语言简单实现_第1张图片

你可能感兴趣的:(数据结构中,两种插入排序的C语言简单实现)