shell排序方法也是一种插入排序算法,于1959年由D.L.Shell提出,其基本方法是:首先将带排序文件分为d1(d1<n)组,将所有彼此之间间隔为d和d的倍数的记录放在一组中,然后在组内进行排序,然后重新去正整数d2<d1,将原带排序序列分为d2组,重复上述分组和排序过程.......直到选取的整数dk=1,即所有带排序的序列元素都在一组中为止。每组中排序采用插入排序。每趟排序di在不断缩小,最后为1。每个di都有不同的选择,只要满足n>d1>d2.......>dk=1,在排序过程中,不同的di的选取对应不同的排序速度。比较常见的选择方法:d1=n,di+1=di/2.......或者di+1=di/3。

eg:原序列的初始状态为 44   35   49   72   26   13   54   61   28  ;[ n=9 ],现在取d1 = n/2 = 4;

第一趟,索引为0,4,8的元素,即44  26  28 一组;索引为1,5的元素,即35  13一组;索引为2,6的元素,即49  54一组;索引为3,7的元素,即72  61一组。组内排序,结果:

26   13   49   61   28   35   54  72   44;

第二趟,d2=d1/2=2;故索引为0,2,4,6,8的元素一组;索引为1,3,5,7的元素一组;组内排序,结果:

26  13    28   35   44   61   49   72   54;

第三趟,d3=d2/2=1;该趟结束后排序结束。所有元素在同一组中,任意前后两个元素之间排序,结果:

13   26   28    35   44   49   54   61   72;

算法:

#include<stdlib.h>
#include<iostream>
using namespace std;
template <class T>
void shell_sort(T *array,int n)
{
int d = (int)(n/2);//将原纪录分为d个组
while(d>=1)
{
int i,j;
for(i = d ; i < n ; i ++)//组内排序
{
T temp = array[i];
for(j = i - d ; j >= 0 && temp < array[j] ; j-=d)
{
array[j+d] = array[j];
}
array[j+d] = temp;
}
d /= 2;//d在逐渐缩小,知道为1
} }
int main(void)
{
int n;
int array[100];
while(cin>>n)
{
for(int i = 0;i < n ; i++)
cin>>array[i];
shell_sort(array,n);
for(int i = 0;i < n ; i ++)
cout<<array[i]<<endl;
} }

shell排序的时间复杂度比直接插入排序要好,其时间复杂度和di的选取有关系。其平均比较次数和移动次数在n^1.3左右。为不稳定的排序方法。

排序算法review<2>--Shell 排序的更多相关文章

  1. Java排序算法(四):Shell排序

    [基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直 ...

  2. Java排序算法之希尔(Shell)排序

    基本思想: 希尔排序就是对直接插入排序的一个优化.现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length).先从ar ...

  3. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  4. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  5. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  6. 八大排序算法之二希尔排序(Shell Sort)

    希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...

  7. 算法系列:Shell 排序

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  8. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

  9. 排序算法review<1>--直接插入排序

    简单插入排序的基本思想:对于原待排序记录中的第i(1<=i<=n-1)个元素Ki,保证其前面的i个元素已经是有序的,要在这前i个元素(K0--Ki-1)中找到合适的位置将第i个元素插入,具 ...

随机推荐

  1. R ggplot2 改变颜色

    p<-ggplot(iris,aes(Petal.Length,Petal.Width,color=Species))+geom_point()cols=c("red",&q ...

  2. org.apache.hadoop.hbase.DoNotRetryIOException: Class org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be loaded Set hbase.table.sanity.checks to false at conf or table descriptor if you want

    https://stackoverflow.com/questions/38495331/apache-phoenix-unable-to-connect-to-hbase 这个坑不该啊 首选配置hb ...

  3. exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  4. Genymotion常见问题整合与解决方案(转)

    常见问题1:Genymotion在开启模拟器时卡在了starting virtual device(注意只有tarting virtual device窗口,没有模拟器的黑屏窗口)    原因:Vir ...

  5. oozie调度hive脚本demo

    1. 环境配置 2. 脚本配置 3. 执行job 4. 查看结果 待发布 ..

  6. 科技巨头们以 "A" 取名的时尚潮流

    科技巨头们以 "A" 取名的时尚潮流 from 公众号  WebHub  世界上有许多巨头公司喜欢以字母 a 打头作公司起名.改名,这主要是因为电话薄是以字母排序的(外国人习惯家里 ...

  7. linux查看端口命令和kill

    1.查看  netstat -atunlp 2kill:kill -9 PID

  8. ubuntu samba 安装

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,是一种在局域网上共享文件和打印机的一种通信协议. 1. 安装 sudo apt-get install samba samba-c ...

  9. thymeleaf教程

    本教程涵盖了常见的前端操作,比如,判断,循环,引入模板,常用函数(日期格式化,字符串操作)下拉,js和css中使用,基本可以应对一般场景. 怎么使用? 前端html页面标签中引入如下: <htm ...

  10. mysql --mysqli::multi_query 和 mysqli_multi_query

    语法: 对象化:bool mysqli::multi_query ( string $query ) 过程化:bool mysqli_multi_query ( mysqli $link , stri ...