当前位置: 首页 > article >正文

排序(2)(希尔排序)

1.插入排序的时间复杂度:最坏为从1到n的等差数列之和。也就是n的平方,但最好为n

2.希尔排序的思路:

        1.预排序(接近有序):  假设gap为一组,总计gap组,对gap组分别插入排序

        2.插入排序

3.两种循环思路实现第一步预处理:即将所有数据分成gap组,gap越大大的数越快到后面,小的数越快到前面,gap越小挪动越慢越接近有序gap越大和越小时解决o(n),gap=1时是直接插入排序,并在组内完成插入排序

代码实现:注释部分为另一种循环思路

void shellsort(int* a, int n)
{
	int gap=3;
	//for (int j = 0; j < gap; j++)
	//{
	//
	// 	for (int i = j; i < n - gap; i = i + gap)
	for(int i=0;i<n-gap;i++)
		{
			int end = n;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;//第一个位置
		}
	//}
	}
	

      以上即为分组插入的思路,而gap的核心写法为:

void shellsort(int* a, int n)
{
	int gap=n;
while(gap>1)
	//for (int j = 0; j < gap; j++)
	//{
	//
	// 	
{
gap=gap/3+1;
for (int i = j; i < n - gap; i = i + gap)
	for(int i=0;i<n-gap;i++)
		{
			int end = n;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;//第一个位置
		}
	//}
	}

}
	

效果为不断趋近于有序,时复为gap*(1+2+......n/gap),约为log3n到log2n之间


http://www.kler.cn/a/232453.html

相关文章:

  • 两种鼠标hover切换对应图片方法对比
  • 数据产品:深度探索与案例剖析
  • ES6字符串的新增方法
  • 【数据价值化】国有企业数据资产入表及估值实践指南:挖掘数字资产新价值
  • change buffer:到底应该选择普通索引还是唯一索引
  • Database Advantages (数据库系统的优点)
  • RibbonOpenFeign源码(待完善)
  • C语言操作符超详细总结
  • 第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估
  • 前端框架学习 Vue(3)vue生命周期,钩子函数,工程化开发脚手架CLI,组件化开发,组件分类
  • Git分支常用指令
  • LabVIEW多任务实时测控系统
  • 书生·浦语大模型第二课作业
  • 基于Linux的HTTP代理服务器搭建与配置实战
  • Gitlab和Jenkins集成 实现CI (三)
  • (力扣)1314.矩阵区域和
  • 【stomp实战】websocket原理解析与简单使用
  • 机器学习7-K-近邻算法(K-NN)
  • SQL笔记-2024/01/31
  • 前后端通讯:前端调用后端接口的五种方式,优劣势和场景
  • 查大数据检测到风险等级太高是怎么回事?
  • 单片机的省电模式及策略
  • 自动驾驶稳步迈向商业化应用
  • [office] 5元+超过1以外的乘以3+地区费用 #微信#微信
  • leetcode(哈希表)49.字母异位词分组(C++详细解释)DAY5
  • 51单片机基础(C语言):定时器时钟