数据结构与算法——谢尔排序

谢尔排序就是每隔一段距离的一个子序列进行插入排序;间隔是从大到小发生改变。谢尔排序也称为缩减增量排序。

比如数据序列v: 81 94 11 96 12 35 17 95 28 58 41 75 15 (序列个数为13)

增量序列是:h1, h2, h3, ......, hk

谢尔增量序列是:hk=N/2, hk-1=hk/2, .....(N是序列的数据个数)

Hibbard增量序列:{1, 3, ..., 2^k-1}

Sedgewick增量序列:{1, 5, 19, 41, 109..}该序列中的项或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1;

 间隔6的子序列是:

1

排序之前v: 81 94 11 96 12 35 17 95 28 58 41 75 15 

81, 17, 15 -----》子序列插入排序之后是-----15, 17, 81

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

2

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

94, 95     -----》子序列插入排序之后是-----94, 95

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

3

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

11, 28     -----》子序列插入排序之后是-----11, 28

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

4

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

58, 96     -----》子序列插入排序之后是-----》 58, 96

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

5

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

12, 41     -----》子序列插入排序之后是-----》 12, 41

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

6

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

35, 75     -----》子序列插入排序之后是-----》 35, 75

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

 

所有的间隔为6的子序列排序之后的序列输出是:v: 15 94 11 58 12 35 17 95 28 96 41 75 81

(见输出结果6: 15 94 11 58 12 35 17 95 28 96 41 75 81):

 间隔3的子序列是:

1

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81 

15, 58, 17, 96, 81 -----》子序列插入排序之后是-----15, 17, 58, 81, 96

排序之后v: 15 94 11 17 12 35 58 95 28 81 41 75 96

2

排序之前v: 15 94 11 17 12 35 58 95 28 81 41 75 96

94, 12, 95, 41     -----》子序列插入排序之后是-----12, 41, 94, 95

排序之后v: 15 12 11 17 41 35 58 94 28 81 95 75 96

3

排序之前v: 15 12 11 17 41 35 58 94 28 81 95 75 96

11, 35, 28, 75     -----》子序列插入排序之后是-----11, 28, 35, 75

排序之后v: 15 12 11 17 41 28 58 94 35 81 95 75 96

(其实到这一步的时候,这个已经是间隔为3这种情况下最后的输出结果了。

见输出结果3: 15 12 11 17 41 28 58 94 35 81 95 75 96

 间隔1的子序列是:

v:15 12 11 17 41 28 58 94 35 81 95 75 96

此时其实就相当于是直接对v进行一次插入排序。

排序输出结果是:

v: 11 12 15 17 28 35 41 58 75 81 94 95 96

运行输出结果:

v: 81 94 11 96 12 35 17 95 28 58 41 75 15 

6: 15 94 11 58 12 35 17 95 28 96 41 75 81 

3: 15 12 11 17 41 28 58 94 35 81 95 75 96 

1: 11 12 15 17 28 35 41 58 75 81 94 95 96 

v: 11 12 15 17 28 35 41 58 75 81 94 95 96


 


用谢尔增量实现谢尔排序的源代码:

/*************************************************************************
	> File Name: shellsort.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年01月08日 星期五 22时16分24秒
 ************************************************************************/

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;



int main()
{
    vector<int> v;
    v.push_back(81);
    v.push_back(94);
    v.push_back(11);
    v.push_back(96);
    v.push_back(12);
    v.push_back(35);
    v.push_back(17);
    v.push_back(95);
    v.push_back(28);
    v.push_back(58);
    v.push_back(41);
    v.push_back(75);
    v.push_back(15);

    cout << "v: ";
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    for (int gap = v.size()/2; gap > 0; gap /= 2){//增量序列
        for (int i = gap; i < v.size(); ++i){//对间隔为gap的子序列进行插入排序
            int tmp = v[i];
            int j = i;

            for ( ; j >= gap && tmp < v[j-gap]; j -= gap)
                v[j] = v[j-gap];

            v[j] = tmp;
            
        }
        cout << gap << ": ";
        copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }

    cout << "v: ";
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值