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("
    ");
        }
    
    }

  • 相关阅读:
    Excel透视表进阶之计算字段、计算项、切片器、页面布局
    Excel透视表进阶之排序、筛选、分组、总计与分类汇总
    Excel透视表基础之字段布局与重命名、更新、数字格式设置、空值与错误值、
    Excel透视表基础之数据源、创建、基本术语、基本操作
    NumPy基础
    Python读写Excel
    逻辑判断
    打印 PRINT
    面向对象
    循环控制
  • 原文地址:https://www.cnblogs.com/hzy168/p/13061006.html
Copyright © 2011-2022 走看看