IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 十大排序之希尔排序 -> 正文阅读

[数据结构与算法]十大排序之希尔排序

希尔排序

希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序

希尔排序是非稳定排序算法。
希尔排序因DL.Shell于1959年提出而得名。

希尔排序是将待排序的数组元素按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。

1. 算法步骤

  1. 确定增量分组次数
  2. 每一次增量中遍历一个分组中所有的元素
  3. 不同分组之间的元素进行插入排序

c o u n t = ? l e n / 2 ? count = \lfloor len/2 \rfloor count=?len/2?

count : 增量分组次数(分多少次组) len:数组长度

2. 动图演示

img

3.代码实现

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void shell_sort(int arr[], int len)//默认是对int类型的数组进行数据交换
{
	for (int i = len; i != 1; i = i/2)//增量分组次数为len/2再向下取整
	{								//i变量循环的次数就是增量分组次数
		for (int j = 0; j < i/2; j++)//遍历分组中的每个元素
		{
			for (int k = j+i/2; k < len; k=k+i/2)//思想是插入排序
			{
				int temp = k;//第一个待交换元素的下标
				while (1)
				{
					if (arr[temp] < arr[temp-i/2])//该分组元素小于前一个分
					{							//组,进行交换
						if (temp < (i / 2))//如果是第一分组,退出死循环
						{
							break;
						}
						swap(arr + temp, arr + temp - i / 2);//交换
						temp = temp - i / 2;//指向前一个序列中相应位置
					}
					else
					{
						break;
					}
				}
			}
		}

	}
}
void main()
{
	int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70,32};//定义一个待排序的数组
	int len = sizeof(arr) / sizeof(*arr);
	printf("\nsort before\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d\t", arr[i]);
	}
	shell_sort(arr,len);
	printf("\shell_sort after\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d\t", arr[i]);
	}
	system("pause");
}

4.实验结果

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:33:23  更:2021-11-29 16:34:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:44:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码