排序算法【希尔排序】

news2024/12/22 0:15:16

一、原理

(1)步长为4时候的插入排序

(2)步长为2的时候的插入排序

(3)步长为1的时候的插入排序

二、代码如下所示:

#ifndef __TEST_H__
#define __TEST_H__
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

bool check(int* ptr, int begin, int len);
int* CreateArray(int len);

/* 测试排序算法的宏定义
 * fun:函数指针
 * arr:数组地址
 * n  :数组元素个数
 */
#define TEST_MY(fun, arr, n) { \
	printf("Test %s: ", #fun); \
	int* ptr = (int*)malloc(n*sizeof(int)); \
	memcpy(ptr, arr, n*sizeof(int)); \
	long long begin = clock(); \
	fun(ptr, 0, n); \
	long long end = clock(); \
	if (check(ptr, 0, n)) { \
		printf(" ok "); \
	} else { \
		printf(" error "); \
	} \
	printf(" len:%d   Tim: %lld ms \r\n", n, (end - begin)*1000/ CLOCKS_PER_SEC); \
	free(ptr); \
}


/*
 * 交换两个变量值的宏定义 
 */


#endif
#include "test.h"
#include <string.h>

/* 检查数组中的数据是不是从小到大的顺序 */
bool check(int* ptr, int begin, int len)
{
	for (int i = begin; i < len - 2; i++)
	{
		if (ptr[i] > ptr[i + 1])
		{
			return false;
		}
	}
	return true;
}

/* 创建一个指定长度的乱序数组 */
int* CreateArray(int len)
{
	int* array = (int*)malloc(sizeof(int) * len);
	for (int i = 0; i < len; i++)
	{
		array[i] = rand() % 10000;
	}
	return array;
}
#include <stdio.h>
#include "test.h"


/* 插入排序 */
void insert_sort(int* arr, int begin, int len)
{
	int j, data;
	for (int i = begin + 1; i < len; i++)
	{
		j = i;
		while (j > begin && arr[j] < arr[j - 1])
		{
			data = arr[j];
			arr[j] = arr[j - 1];
			arr[j - 1] = data;
			j -= 1;                 //放在最后在减少,放在最前面会出错。
		}
	}
}


/* 无监督插入排序算法 */
void unguarded_insert_sort(int* arr, int begin, int len, int step)
{
	int data;
	int min_index = begin;
	//找到最小值
	for (int i = begin + step; i < len; i+= step)
	{
		if (arr[i] < arr[min_index])
		{
			min_index = i;
		}
	}
	//向前插入,如果直接交换,就不是插入了。
	while (min_index > begin)
	{
		data = arr[min_index];
		arr[min_index] = arr[min_index - step];
		arr[min_index - step] = data;
		min_index -= step;
	}

	//无监督向前插入排序
	for (int i = begin + 2 * step; i < len; i+= step)
	{
		int j = i;
		while (arr[j] < arr[j - step])   //最后一次循环总是不符合条件的
		{
			data = arr[j];
			arr[j] = arr[j - step];
			arr[j - step] = data;
			j -= step;
		}
	}
}


/* 希尔排序 */
void shell_sort(int* arr, int begin, int len)
{
	int k = 2, n = (len - begin), step;
	do
	{
		step = (n / k == 0 ? 1 : n / k);
		for (int i = begin; i < begin + step; i++)
		{
			unguarded_insert_sort(arr, begin, len, step);
		}
		k *= 2;              //步长每次乘以2
	} while (step !=1);      //step的步长不为1
} 


void main()
{
	int* arr = CreateArray(10000);
	//TEST_MY(selection_sort, arr, 10000);
	TEST_MY(shell_sort, arr, 10000);
	/*unguarded_insert_sort(arr, 0, 10000, 1);*/
	printf("data:%d, %d, %d, %d\r\n", arr[0], arr[1], arr[2], arr[3]);
	free(arr);
	return;
}

运行的结果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IEEE出版,华中科技大学主办】2024年电气工程自动化与信息处理国际会议(EEAIP 2024,9月20-22)

2024年电气工程自动化与信息处理国际会议&#xff08;EEAIP 2024&#xff09;作为第四届能源、动力与电气工程国际学术会议&#xff08;EPEE 2024&#xff09;的分会场&#xff0c;将于2024年9月20-22日在中国武汉举行。 本届主会&#xff08;EPEE 2024&#xff09;由华中科技大…

【Python - 爬虫】SSLError 错误:处理 HTTPS 请求中的 SSLError 问题

文章目录 一、SSLError 错误概述1. 错误的产生2. 常见的错误信息 二、SSLError 的可能原因分析1. 代理配置问题2. 网络传输问题3. 证书问题 三、解决方案与最佳实践1. 配置代理2. 通过系统代理3. 使用 requests.Session 管理请求4. 临时禁用代理 四、其他解决方法1. 更新证书2.…

4.4 数据查询语言(DQL):复杂查询与连接操作

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

【Redis】Redis典型应用-分布式锁

目录 什么是分布式锁&#xff1f; 分布式锁的基础实现 引入过期事件 引入校验ID 引入lua 引入watch dog&#xff08;看门狗&#xff09; 引⼊ Redlock 算法 什么是分布式锁&#xff1f; 在⼀个分布式的系统中, 也会涉及到多个节点访问同⼀个公共资源的情况. 此时就需要…

访非洲 助公益 促和平 朱共山妻子杨燕女士勇担社会责任

作为协鑫集团董事长朱共山先生的夫人&#xff0c;杨燕女士一直以其卓越的社会责任感和对公益事业的热忱著称。近些年&#xff0c;杨燕女士前往非洲访问&#xff0c;旨在加强中非之间的友好交流&#xff0c;支持我国传统书画事业发展&#xff0c;并促进地区的和平与稳定。朱共山…

AI大模型入门基础教程(非常详细),AI大模型入门到精通,收藏这一篇就够了!

什么是 AI大模型&#xff1f; AI大模型是指使用大规模数据和强大的计算能力训练出来的人工智能模型。 这些模型通常具有高度的准确性和泛化能力&#xff0c;可以应用于各种领域&#xff0c;如自然语言处理、图像识别、语音识别等。 为什么要学AI大模型&#xff1f; 2024人工…

【Hot100】LeetCode—189. 轮转数组

目录 1- 思路自定义 reverse 翻转函数 2- 实现⭐189. 轮转数组——题解思路 3- ACM 实现 原题链接&#xff1a;189. 轮转数组 1- 思路 自定义 reverse 翻转函数 2- 实现 ⭐189. 轮转数组——题解思路 class Solution {public void rotate(int[] nums, int k) {k % nums.lengt…

瑞友科技项目经理认证负责人杨文娟受邀为第四届中国项目经理大会演讲嘉宾︱PMO评论

全国项目经理专业人士年度盛会 北京瑞友科技股份有限公司项目经理认证负责人杨文娟女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“瑞友科技项目经理人才培养体系落地实践”。大会将于10月26-27日在北京举…

HCIP-HarmonyOS Application Developer 习题(三)

1、在JS(JavaScript)Ul框架中&#xff0c;完成对平台层进行抽象&#xff0c;提供抽象接口&#xff0c;对接到系统平台的是哪一层? A. 应用层 B. 前端框架层 C. 引擎层 D. 平台适配层 答案&#xff1a;D 分析&#xff1a;适配层主要完成对平台层进行抽象&#xff0c;提供抽象接…

在亚马逊云科技上部署Llama大模型并开发负责任的AI生活智能助手

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上利用Sag…

​R语言里的字符型向量和布尔型向量运用

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 3章1节&#xff1a;数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算-CSDN…

【机器学习】反向传播的基本概念、如何优化反向传播算法以及大量样本如何优化反向传播

引言 反向传播算法是深度学习和机器学习中的一个核心概念&#xff0c;主要用于训练神经网络 文章目录 引言一、反向传播算法的基本概念1.1 反向传播算法的基本原理1.2 前向传播1.3 计算误差1.4 反向传播1.5 应用与挑战1.6 神经元模型和神经网络结构1.7 总结 二、如何优化反向传…

JavaScript基础——函数

函数简介 定义函数 调用函数 函数的参数和返回值 函数参数 1.有形参情况下不传递实参 2.传递数量少于形参个数的实参 3.传递数量等于形参个数的实参 函数返回值 报错Uncaught SyntaxError: Illegal return statement 返回数字和字符串 返回数组、对象和函数 没有返回…

史上最快,仅需10ms的动态点云剔除方法

论文题目&#xff1a; A Fast Dynamic Point Detection Method for LiDAR-Inertial Odometry in Driving Scenarios 论文作者&#xff1a; Zikang Yuan, Xiaoxiang Wang, Jingying Wu, Junda Cheng, Xin Yang 导读&#xff1a; 本文实现了一种十分快速的动态点剔除方法&…

python 数据可视化折线图练习(下:代码演示)

根据上篇对三国疫情情况数据的罗列&#xff0c;构建折线图完成数据展示。&#xff08;示例如下&#xff09; 接下来是具体代码演示 import json from pyecharts.charts import Line from pyecharts.options import TitleOpts , LegendOpts , ToolboxOpts ,VisualMapOpts , T…

vue 3d echarts scatter3D元素塌陷,图标塌陷进地图完美解决方案

当我们手机用 scatter3D 类型时&#xff0c;最小值因为渲染问题会塌陷进模型里面&#xff0c;所以只要让value固定&#xff0c;再将label formatter 配合 boxHeight属性即可解决&#xff0c;&#xff08;代码附带自定义label图标解决办法&#xff09; 解决&#xff1a; <…

np.pad各种方式的图文解释

‘constant’——表示连续填充相同的值&#xff0c;每个轴可以分别指定填充值&#xff0c;constant_values&#xff08;x,y&#xff09;时前面用x填充&#xff0c;后面用y填充&#xff0c;缺省值填充0 ‘edge’——表示用边缘值填充 ‘linear_ramp’——表示用边缘递减的方式填…

Windows编程:图标资源、光标资源、字符串资源、加速键资源、WM_PAINT消息、绘图

承接前文&#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列win32-鼠标消息、键盘消息、计时器消息、菜单资源 本文目录 图标资源光标资源WM_SETCURSOR 消息 字符串资源加速键资源WM_PAINT 消息绘图绘图编程绘图基础基…

后端Web之分层解耦(控制反转IOC-依赖注入DI)

目录 1.三层架构 2.IOC-DI引入 3.IOC-DI使用 4.IOC细节 5.DI细节 内聚&#xff08;Cohesion&#xff09;和耦合&#xff08;Coupling&#xff09;是软件工程中两个重要的概念&#xff0c;它们衡量了软件组件的组织方式和组件之间的相互依赖程度。高内聚性意味着模块内的元…

2024真无线蓝牙耳机怎么选?24年四款性价比畅销爆款机型盘点

2024年&#xff0c;真无线蓝牙耳机的市场依旧竞争激烈&#xff0c;各种品牌和型号如雨后春笋般涌现&#xff0c;面对琳琅满目的选择&#xff0c;2024真无线蓝牙耳机怎么选&#xff1f;消费者在寻找具备高性价比和优秀性能的耳机时往往会感到困惑&#xff0c;那么我将针对大家的…