• 数据结构:希尔排序


    希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。

     1 void shell_sort1(int a[], int n)
     2 {
     3     int i,j,gap;
     4     // gap为步长,每次减为原来的一半。
     5     for (gap = n / 2; gap > 0; gap /= 2)
     6     {
     7         // 共gap个组,对每一组都执行直接插入排序
     8         for (i = 0 ;i < gap; i++)
     9         {
    10             for (j = i + gap; j < n; j += gap) 
    11             {
    12                 // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
    13                 if (a[j] < a[j - gap])
    14                 {
    15                     int tmp = a[j];
    16                     int k = j - gap;
    17                     while (k >= 0 && a[k] > tmp)
    18                     {
    19                         a[k + gap] = a[k];
    20                         k -= gap;
    21                     }
    22                     a[k + gap] = tmp;
    23                 }
    24             }
    25         }
    26     }
    27 }

    第一趟:gap=4

    第二趟:gap=2

     第三趟:gap=1

     希尔排序代码实现:

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 void Shell_sort(int a[],int n)
     5 {
     6     int gap,i,j;
     7     for(gap=n/2;gap>0;gap/=2)
     8     {
     9         for(i=0;i<gap;i++)
    10         {
    11             for(j=i+gap;j<n;j+=gap)
    12             {
    13                 if(a[j]<a[j-gap])
    14                 {
    15                     int temp=a[j];
    16                     int k=j-gap;
    17                     while(k>=0&&a[k]>temp)
    18                     {
    19                         a[k+gap]=a[k];
    20                         k-=gap;
    21                     }
    22                     a[k+gap]=temp;
    23                 }
    24             }
    25         }
    26     }
    27 }
    28 int main()
    29 {
    30     int a[100]={0};
    31     int n,t;
    32     cin>>t;
    33     while(t--)
    34     {
    35         cin>>n;
    36         for(int i=0;i<n;i++) cin>>a[i];
    37         Shell_sort(a,n);
    38         for(int i=0;i<n;i++) cout<<a[i]<<" ";
    39         cout<<endl;
    40     }
    41     return 0;
    42 }
    天晴了,起飞吧
  • 相关阅读:
    php1
    c# out参数
    c#冒泡算法
    c#方法 最大值我最小值
    方法
    OUT参数
    芮年
    PHP博客
    数组习题
    从郑和下西洋 到华人爱燕窝
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/12129948.html
Copyright © 2020-2023  润新知