• 数据结构-插入排序之希尔排序


    希尔排序是一种分组插入排序,基本思想如下:

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

    算法

    //文件名:exp10-2.cpp
    #include <stdio.h>
    #define MAXE 20            //线性表中最多元素个数
    typedef int KeyType;
    typedef char InfoType[10];
    typedef struct           //记录类型
    {
        KeyType key;        //关键字项
        InfoType data;        //其他数据项,类型为InfoType
    } RecType;
    void ShellSort(RecType R[],int n)    //希尔排序算法
    {
        int i,j,d,k;
        RecType temp;
        d=n/2;                    //d取初值n/2
        while (d>0) 
        {    
            for (i=d;i<n;i++)    //将R[d..n-1]分别插入各组当前有序区中
            {    
                j=i-d;
                while (j>=0 && R[j].key>R[j+d].key)        
                {    
                    temp=R[j];      //R[j]与R[j+d]交换
                    R[j]=R[j+d];
                    R[j+d]=temp;
                    j=j-d;
                }
            }
            printf("d=%d: ",d);    //输出每一趟的排序结果
            for (k=0;k<n;k++)
                printf("%3d",R[k].key);
            printf("
    ");
            d=d/2;               //递减增量d
        }
    }
    void main()
    {
        int i,k,n=10;
        KeyType a[]={9,8,7,6,5,4,3,2,1,0};
        RecType R[MAXE];
        for (i=0;i<n;i++)
            R[i].key=a[i];
        printf("初始关键字: ");            //输出初始关键字序列
        for (k=0;k<n;k++)
            printf("%3d",R[k].key);
        printf("
    ");
        ShellSort(R,n);
        printf("最后结果: ");            //输出初始关键字序列
        for (k=0;k<n;k++)
            printf("%3d",R[k].key);
        printf("
    
    ");
    }
    作者:leemoaly
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    canvas实现文字分行
    二维码扫描添加闪光灯的功能
    修改二维码扫描框的大小位置
    Android中实现EditText圆角的方法
    利用FrameLayout实现遮罩层
    EditText中的灰色提示
    实现等待动画
    发送短信
    自定义EditText动态在EditText中添加图片
    xml解析
  • 原文地址:https://www.cnblogs.com/kavs/p/4974900.html
Copyright © 2020-2023  润新知