【排序算法】希尔排序

在介绍希尔排序之前,我就不过多介绍冒泡排序,选择排序了,这两个排序在我看来就是在找最大最小值。
插入排序因为待会在希尔排序中会用到,所以我简单介绍一下,
插入排序算法思想:就是得到一个数后要插入一列已经排序好的数组中,以次比较,找到位置后放入即可。
算法步骤:
1、从第一个元素开始,该元素被认为已经被排序。(一个元素)
2、去除下一个元素,放入已经排序的数组中(从后向前扫描)
3、如果新元素小于数组中的元素,向前继续比较;如果新元素大于数组中的元素,说明他的位置在数组中的元素后一位。
在这里插入图片描述

#include<iostream>
#include <new>
int* InsertSort(int *a,int quantity)
{
       for (int i=0;i<quantity;i++)
       {
              for(int j=i-1;j>=0;j--)
              {
                     if(a[j+1]<a[j])         //如果后一个数比前一个数小,就交换两者位置
                     {
                            int temp = a[j];
                            a[j]=a[j+1];
                            a[j+1]=temp;
                     }
                     else break;
               }
       }
       return a;
}
int main()
{
       using namespace std;
       int quantity;
       int *num;
       cin>>quantity;      //输入数组元素个数
       num = new int[quantity];
       for (int i;i<quantity;i++)
       {
              cin>>num[i];
       }
       num = InsertSort(num,quantity);
       for(int i=0;i<quantity;i++)
       {
              cout<<num[i]<<" ";
       }
       return 0;
}

而希尔排序是由插入排序改进而来,希尔排序的有一个名称叫做缩小增量排序,由此可见,它和插入排序的区别在于,它并不是间隔一直为1的排序,而是有一个增量序列,说白了就是每一次排序弄一个间隔,然后分成几组数据进行排序。
算法步骤:
1、选择一个增量序列{t1,t2,t3,t4…tk},以次减小,最后一个一定是1。在实际应用中,可以选择增量从数组长度开始每次缩小一半作为增量。
2、进行k次排序,k为增量个数。
3、用直接插入排序。
在这里插入图片描述

int * HellSort(int*a,int quantity)
{
       int gap = quantity/2;
       while(gap>=1)
       {
              for (int i=0;i<quantity/gap;i++)
              {
                     for(int j=i-1;j>=0;j--)
                     {
                            if(a[j+1]<a[j])         //如果后一个数比前一个数小,就交换两者位置
                            {
                                   int temp = a[j];
                                   a[j]=a[j+1];
                                   a[j+1]=temp;
                            }
                            else break;
                    }
              }
              gap=gap/2;
       }
       return a;
}
int main()
{
       using namespace std;
       int quantity;
       int *num;
       cin>>quantity;      //输入数组元素个数
       num = new int[quantity];
       for (int i;i<quantity;i++)
       {
              cin>>num[i];
       }
       num = HellSort(num,quantity);
       for(int i=0;i<quantity;i++)
       {
              cout<<num[i]<<" ";
       }
       return 0;
}

推荐个学习排序算法的博客。
https://www.cnblogs.com/onepixel/articles/7674659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值