• 希尔排序--C语言版


    一、ShellSort--希尔排序 

    本质上:希尔排序是gap>1时的预排序  +  gap==1时的插入排序

    特点:gap越大,大的数越快到后面,小的数越快到前面,越接近无序; gap越小,大的数越慢到后面,小的数越慢到前面,越接近有序。

    在这里插入图片描述

    1.思路 

    (1).第一步--预排序(接近有序)
    (2).第二步--直接插入排序(有序)

    2.实现 

    void ShellSort(int* a, int n)//针对数据量大的
    {


        一、单趟的插入
      

    1.   int gap = 3;
    2. //1.第一个for是表示第几组
    3.     for (int j = 0; j < gap; ++j)为啥j
    4.                                    距,全部数是被分为gap组的,
    5.                                    同组中的数间隔gap.包括间隔
    6.                                    中的数和本身,就只有gap个
    7.     {
    8. //2.第二个for表示第j组中的第几个
    9.         for (int i = j; i < n - gap; i += gap)
    10.         {
    11.             int end = i;
    12.             int tmp = a[end + gap];
    13.             while (end >= 0)
    14.             {
    15.                 if (tmp < a[end])
    16.                 {
    17.                     a[end + gap] = a[end];
    18.                     end -= gap;
    19.                 }
    20.                 else
    21.                 {
    22.                     break;
    23.                 }
    24.             }
    25.             a[end + gap] = tmp;
    26.         }
    27.     }


        
                
    二、多趟的插入


    1.法1        将每一组gap分开完成,先完成一组再完成另一组
        //多趟的插入
        // gap > 1时是预排序
        // gap 最后一次等于1,是直接插入排序

    1.     int gap = n;
    2.     while (gap > 1)
    3.     {
    4.         gap = gap / 3 + 1;//官方规定的gap的缩减速度,当gap缩减到1时,则变为了插入排序
    5.         for (int j = 0; j < gap; ++j)//先完成一个的,再完成另一个
    6.         {                          为啥j
    7.                                    距,全部数是被分为gap组的,
    8.                                    同组中的数间隔gap.包括间隔
    9.                                    中的数和本身,就只有gap个
    10.         
    11.             for (int i = j; i < n - gap; i += gap)//为啥i
    12.             {
    13.                 int end = i;
    14.                 int tmp = a[end + gap];
    15.                 while (end >= 0)
    16.                 {
    17.                     if (tmp < a[end])
    18.                     {
    19.                         a[end + gap] = a[end];
    20.                         end -= gap;
    21.                     }
    22.                     else
    23.                     {
    24.                         break;
    25.                     }
    26.                 }
    27.                 a[end + gap] = tmp;
    28.             }
    29.         }
    30.     }

    疑问:

    1.for (int j = 0; j < gap; ++j)      为啥j

    2.for (int i = j; i < n - gap; i += gap)//为啥i

    如int tmp = a[end + gap];
             

    2.法2        所有gap组并发进行

        //多趟的插入
        // gap > 1时是预排序
        // gap 最后一次等于1,是直接插入排序

        
     

    1.    int gap = n;
    2.     while (gap > 1)
    3.     {
    4.         gap = gap / 3 + 1;
    5.         for (int i = 0; i < n - gap; ++i)//gap组数据交替插入排序(优化)
    6.         {
    7.             int end = i;
    8.             int tmp = a[end + gap];
    9.             while (end >= 0)
    10.             {
    11.                 if (tmp < a[end])
    12.                 {
    13.                     a[end + gap] = a[end];
    14.                     end -= gap;
    15.                 }
    16.                 else
    17.                 {
    18.                     break;
    19.                 }
    20.             }
    21.             a[end + gap] = tmp;
    22.         }
    23.     }

    }
    图解:

  • 相关阅读:
    手部骨骼跟踪能力,打造控制虚拟世界的手势密码
    tsconfig编译属性isolatedModules的作用
    MySQL基本操作之创建数据库
    Day03 计算机信息的存储
    再谈Java泛型
    “拨”取数字的典例:N位水仙花数判断及水仙花数变种
    bp神经网络对数据的要求,bp神经网络参数有哪些
    Unity3D 常用得内置函数(Cg与GLSL)详解
    智慧化转型赋能园区创新:科技创新引领产业智慧化,打造高效发展新格局
    [技术发展-22]:网络与通信技术的应用与发展快速概览-2- 通信技术
  • 原文地址:https://blog.csdn.net/anyway33/article/details/126526085