插入排序

插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。插入排序主要包括:直接插入排序和希尔排序。

一、直接插入排序

1、排序思想

假设待排序的记录存放在数组R[1..n]中,初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

2、实例分析

【例】给定一组关键字(46,39,17,23,28,55,18,46),要求按直接插入排序算法给出每一趟排序结果。

3.代码实例

 1 #include <stdio.h>
 2 //插入排序
 3 int* insertSort(int *R,int n)
 4 {
 5     int i,j;
 6     for(i=2;i<n;i++)
 7     {
 8         if(R[i]<R[i-1])
 9         {
10             R[0]=R[i];
11             for(j=i-1;R[0]<R[j];j--)
12             {
13                 R[j+1]=R[j];
14             }
15             R[j+1]=R[0];
16         }
17     }
18     return &R[0];
19 }
20 
21 
22 int main()
23 {
24     int a[11] ={NULL,46,39,17,23,28,55,18,46};
25     int *r = insertSort(&a[0],9);
26     for(int i=1;i<=8;i++)
27     {
28         printf("%d ",r[i]);
29     }
30     return 0 ;
31 }

结果:

 

 

二、希尔排序

1、排序思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。

2、实例分析

初始关键字序列为(36,25,48,27,65,25,43,58,76,32)。其增量序列的取值依次为5,3,l,排序过程如图所示。

3、代码实例

//希尔排序
int* shellSort(int *R,int dk,int n)
{
    int i,j;
    for(i=dk+1;i<=n;i++)
    {
        if(R[i]<R[i-dk])
        {
           R[0] = R[i];
           j=i-dk;
           while (j>0&&R[0]<R[j])
           {
               R[j+dk]=R[j];
               j=j-dk;
           }
           R[j+dk]=R[0];           
        }
    }
    return R;
}

int main()
{
    // 测试希尔排序
    int dk[3]={5,3,1};
    int a[11] ={NULL,36,25,48,27,65,25,43,58,76,32};
    int *p=NULL;
    for(int i=0;i<3;i++)
    {
        p=shellSort(a,dk[i],10);
        for(int j=1;j<=10;j++)
        {
            printf("%d ",p[j]);
        } 
        printf("\n");
    }

}

 

 

posted @ 2020-06-07 16:28  hzy168  阅读(336)  评论(0编辑  收藏  举报