zoukankan      html  css  js  c++  java
  • 插入排序

    插入排序(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("
    ");
        }
    
    }

  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/hzy168/p/13061006.html
Copyright © 2011-2022 走看看