c语言插入排序及希尔排序详解

目录

前言:

插入排序:

希尔排序:


前言:

排序在我们生活中无处不在,比如学生成就排名,商品价格排名等等,所以排序在数据结构的学习中尤为重要,今天就为大家介绍两个经典的排序算法:插入排序和希尔排序。

插入排序:

思路图:

思路:

从第二个元素开始和前面的元素依次比较,如果前面的元素比它大,则将该元素移到后一位,如果该元素比它小,则直接插入该元素后面。

代码实现:

void InsertSort(int* a, int n)
{
	int i = 0;
	for (i = 0;i < n-1;i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

时间复杂度:

最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
  最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)

希尔排序:

其实希尔排序就是插入排序的进阶版,可以说是希尔对插入排序进行了优化。

思路图:

思路:

步骤一:预排序,使数组接近有序

步骤二:插入排序

先将每间隔gap个元素的数据分为一组,将每组分别进行插入排序,使其接近有序

gap逐渐减小,gap减为1时就是进行步骤二的插入排序。

代码实现:

void ShellSort(int* a, int n)
{
	int gap = n;
	while(gap>1)
	{
		gap = gap / 2;
		int i = 0;
		for (i = 0;i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

纸上得来终觉浅,绝知此事要躬行。快去实践一下吧。

相关推荐
sp_fyf_20241 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-05
人工智能·深度学习·神经网络·算法·机器学习·语言模型·自然语言处理
C++忠实粉丝1 小时前
前缀和(6)_和可被k整除的子数组_蓝桥杯
算法
木向1 小时前
leetcode42:接雨水
开发语言·c++·算法·leetcode
TU^1 小时前
C语言习题~day16
c语言·前端·算法
吃什么芹菜卷1 小时前
深度学习:词嵌入embedding和Word2Vec
人工智能·算法·机器学习
wclass-zhengge1 小时前
数据结构与算法篇(树 - 常见术语)
数据结构·算法
labuladuo5201 小时前
AtCoder Beginner Contest 372 F题(dp)
c++·算法·动态规划
夜雨翦春韭1 小时前
【代码随想录Day31】贪心算法Part05
java·数据结构·算法·leetcode·贪心算法
hsling松子6 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1237 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp