【数据结构与算法】插入排序、希尔排序

记录自己所学,无详细讲解

1.插入排序

从第二个元素开始, 第二个元素前面的元素看作一个数组,然后从右到左依次比较

如果第二个元素大于前面第一个元素则不变,因为升序,大于他则代表位置不用变动

如果第二个元素小于前面第一个元素,则保存第二个元素值进tmp变量里,然后再比较第一个元素前面的,因为是第一个元素 所以没有元素可比较了,所以最后将tmp值赋给此时的比较位置

复制代码
#include <stdio.h>
void Insertsort(int a[])
{
	int i = 0;
	for (int i = 0; i < 9;i++)
	{
		int end = i;
	    int tmp = a[end + 1];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + 1] = a[end];
					end--;                                         
				}
				else
				{
					break;
				}
			}
			a[end+1] = tmp;
		}
	}
void Print(int a[])
{
	for (int i = 0; i < 10; i++)
	{
		printf("%3d", a[i]);
	}
}
int main()
{
	int a[10] = { 3, 4, 6, 1, 7, 9, 2, 5, 8, 10 };
	Insertsort(a);
	Print(a);
	return 0;
}

2.希尔排序

插入排序的优化版(只是多了一层循环,添加了一个gap变量,更改了几个变量值)

在正式插入排序前先进行了几次小的插入排序,将数组先大概的排个序,大概排完序再正式排

通过gap来作为分割距离,将数组分成多组来进行插入排序,最后gap=1是表示不用分组了,则代表正式插入排序了

希尔排序时间复杂度是n的1.3次方 而直接正式插入排序的话时间复杂度是n的2次方,数据越多差距越明显

复制代码
#include <stdio.h>
void Shellsort(int a[])
{
	int gap =10;
	while (gap>1)
	{
		gap = gap / 2;
		for (int i = 0; i < 10-gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
void Print(int a[])
{
	for (int i = 0; i < 10; i++)
	{
		printf("%3d", a[i]);
	}
}
int main()
{
	int a[10] = { 3, 4, 6, 1, 7, 9, 2, 5, 8, 10 };
	Shellsort(a);
	Print(a);
	return 0;
}
相关推荐
weixin_307779131 分钟前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
Xiaok101810 分钟前
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
开发语言·神经网络·php
ゞ 正在缓冲99%…11 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
绿草在线12 分钟前
Mock.js虚拟接口
开发语言·javascript·ecmascript
xuanjiong12 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
go_bai22 分钟前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
小郝 小郝24 分钟前
【C语言】strstr查找字符串函数
c语言·开发语言
yinhezhanshen29 分钟前
理解rust里面的copy和clone
开发语言·后端·rust
惊鸿.Jh31 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L32 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题