排序算法-希尔排序法(ShellSort)

排序算法-希尔排序法(ShellSort)

1、说明

我们知道当原始记录的键值大部分已排好序的情况下插入排序法非常有效,因为它不需要执行太多的数据搬移操作。希尔排序法是D.L.Shell在1959年7月发明的一种排序法,可以减少插入排序法中数据搬移的次数,以加速排序的进行。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少区间的距离。

2、算法分析

  1. 任何情况下时间复杂度为
  2. 希尔排序和插入排序法一样,都是稳定排序法。
  3. 因为只需一个额外的空间,所以空间复杂度为最佳。
  4. 这种排序法适用于大部分数据都已排序的情况。

3、C++代码

cpp 复制代码
#include<iostream>
using namespace std;

int main() {

	const int size = 6;
	int data[size] = { 9,7,5,3,4,6 };

	cout << "原始数据:" << endl;
	for (int i = 0; i < size; i++) {
		cout << data[i] << "  ";
	}
	cout << endl;

	int i;				//循环次数
	int j;				//需要排序的元素索引
	int temp;			//需要排序的元素暂存数据
	int jump = size/2;	//间隔
	while (jump != 0) {
		//第1次:
		//3  4  5  9  7  6
		//第2次:
		//3  4  5  6  7  9
		for (i = jump; i < size; i++) {
			temp = data[i];
			j = i - jump;
			//temp > data[j]	从大到小排序的条件
			//temp < data[j]	从小到大排序的条件
			while (temp < data[j] && j >= 0) {
				data[j + jump] = data[j];
				j -= jump;
			}
			data[j + jump] = temp;
		}
		jump /= 2;
	}

	cout << "最终数据:" << endl;
	for (int i = 0; i < size; i++) {
		cout << data[i] << "  ";
	}
	cout << endl;

	return 0;
}

输出结果

相关推荐
余~~185381628006 分钟前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
刚学HTML37 分钟前
leetcode 05 回文字符串
算法·leetcode
蜀黍@猿40 分钟前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧40942 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生44 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
zh路西法1 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
大G哥1 小时前
java提高正则处理效率
java·开发语言
AC使者1 小时前
#B1630. 数字走向4
算法
冠位观测者1 小时前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
VBA63371 小时前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言