zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。希尔排序是非稳定排序算法

    直接插入排序:对于数据量较小,数据序列基本有序的情况下算法复杂度较低

    希尔排序基本思想:通过将序列划分若干组小数据量的序列(设置增量序列),别且对各组序列分别进行直接插入排序。

    因此:希尔排序等价于将原有数据量大的直接插入拆分成数次小的直接插入,形成基本有序的序列,通过最后增量为1的直接插入整合效果。
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXSIZE 30
    typedef struct{
         int  r[MAXSIZE];
         int length;
    }SqList;
    //增量为dk时的一趟排序具体过程
    void ShellInsert(SqList *L,int dk){
          int i=0,j=0,k=0;
          for(i=0;i<dk;i++){ //根据增量大小,数组可以拆分为dk组数据,每组数据以第i个打头
             for(j=i;j<L->length;j=j+dk){
                     int temp=L->r[j]; //存放临时记录Key值
                     for(k=j-dk;k>=0&&temp<L->r[k];k=k-dk)
                           L->r[k+dk]=L->r[k];//后移记录,找到插入位置
                     L->r[k+dk]=temp; //赋值插入
             }
          }
          return;
    }
    //根据增量序列增量个数对数组进行t趟排序,最后一趟增量必为1
    void  ShellSort(SqList *L,int dlta[],int t){
         for(int k=0;k<t;k++){
            ShellInsert(L,dlta[k]); //
         }
         return;
    }
    
    int main()
    {
        int t=4;
        int dlta[4]={5,3,2,1};//设置增量序列
        SqList L;
        L.length=12;
        for(int i=0;i<12;i++)
            scanf("%d",&L.r[i]);//输入待排序数组
        printf("Befor Sort:
    ");
        for(int i=0;i<12;i++)
            printf("%d	",L.r[i]);
        ShellSort(&L,dlta,t);//希尔排序
        printf("
    After Sort:
    ");
        for(int i=0;i<12;i++)
            printf("%d	",L.r[i]);
        return 0;
    }
    

    结果显示:
    在这里插入图片描述
    在这里插入图片描述

    配图采摘点#感谢

  • 相关阅读:
    Eclipse启动不了
    第三章Hibernate关联映射
    System Generator简介
    Chipscope使用
    总线及数据传输技术【待完善】
    多相滤波器
    notepad++与ISE/Vivado关联
    常用IP核
    〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理
    〖Android〗OK6410a的Android HAL层代码编写笔记
  • 原文地址:https://www.cnblogs.com/zhichao-yan/p/13368515.html
Copyright © 2011-2022 走看看