希尔排序的c++代码实现

头文件是希尔排序的代码,mian函数是一个测试样例

希尔排序就是采用了插入排序的一个思想,然后先让部分的序列(设置固定的间隔的所有序列)有序(有序的方法也是采用了插入排序的每轮的思想先前排好后选择插入位置),再逐步的(缩小间隔)到整体序列有序

因为插入排序在部分很多已经有序的序列时处理是非常高效的(要是比前面的都大,只需要比较这一次,且移动也不移动,要是已经是顺序,复杂度o(n)单纯每次比较一下),所以这种前面排排排,逐渐有序的序列再大排排是理论可行的

shellsort1.h

#pragma once

template<typename T>
void shellsort(T D[], int n) {//n还是实际的数组的个数,但是还是data[0]用来存放临时存储的变量
	int d, i, j;

	for (d = n / 2; d >= 1; d = d / 2) {
		for (i = d + 1; i <= n; ++i) {//这块是很多组一起再排,这种方法要学会
			if (D[i] < D[i - d]) {
				D[0] = D[i];
				for (j = i - d; j > 0 && D[0] < D[j]; j = j - d)
					D[j + d] = D[j];
				D[j + d] = D[0];//同样的j+d
			}
		}
	}
}

8.2shellsort.cpp

// 8.2shellsort.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
希尔排序的代码实现以及例题

#include <iostream>
#include"shellsort1.h"
using namespace std;

int main()
{
    int data[9] = { 0,43,35,1,87,99,67,78,10 };
    int length = 8;

    cout << "原数列:" << endl;
    for (int i = 1; i <= length; ++i)
        cout << data[i] << " ";
    cout << endl;

    shellsort(data, length);
    cout << "现希尔数列1:" << endl;
    for (int i = 1; i <= length; ++i)
        cout << data[i] << " ";
    cout << endl;

}

特别的:

1、在希尔里面 虽然data[0]是用来临时存储变量的,但是不是哨兵,因为j-d这个不一定就能到0这个位置去,所以还是需要每次判断j是否还>0,不需要含0因为只是一块费空间

2、哈希是先间隔n/2一组(也可以是其他的n/3...),然后是间隔n/4一组,最后是间隔1就是全部的数组再排,但是在间隔组间排的时候方便写,是让他们几组的一起排的,见第二个for循环,很奇妙,就是要是真按照我们逻辑理解的来看的反而这个程序不好写,这个需要积累~!

3、希尔排序 只 能运用于     顺序存储     的情况

4、希尔排序算是插入排序在较优的情况下的优化,先让表中部分有序,再整体有序

(不过一般情况下,希尔排序还是插入排序情况效率更高?存疑)

关于时间和空间复杂度:

空间复杂度:o(1) 常数个辅助单元

时间复杂度:依赖于增量序列的函数的情况

                     最优:o(n^1.3)这个数学上还没有证明,在特定范围能够达到这个数

                     最坏+平均:o(n^2),就是当希尔最开始就是n/n=1的情况其实就退化成了插入排序,所以o(n^2)

稳定性:不稳定

适用于:数组可以(顺序表),链表不太可行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值