基础数据结构14:直接插入排序和希尔排序

本文介绍了两种基本排序算法:直接插入排序和希尔排序。直接插入排序在小规模或接近有序的数据集上表现良好,其时间复杂度为O(n^2),空间复杂度为O(1),是稳定的排序算法。希尔排序是一种改进的插入排序,通过增量序列逐步减少排序间隔,提高了效率,时间复杂度介于O(n^1.3)到O(n^1.5)之间,但它是不稳定的排序算法。文章通过代码实现详细展示了这两种排序算法的工作过程。
摘要由CSDN通过智能技术生成

1.请添加图片描述
2.直接插入排序


#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//八大排序   排序分为升序和降序   我们默认使用升序
//算法的描述  算法的实现  算法的评价(时间复杂度,空间复杂度,稳定性)
//什么是稳定性:如果排序前A在A`的前面,排序之后A孩子A`的前面,则排序算法稳定
//如何判断其稳定性:看算法中是否存在跳跃交换
//第一个排序算法:直接插入排序:每次从待排序队列中取一个值,放到已排序好的队列,再次保持有序,重复这样的动作,直到把待排序队列中的值全部取完  时间复杂度O(n^2) 空间复杂度O(1)  稳定的
//第二个排序算法:希尔排序(缩小增量排序):是一个特殊的直接插入排序,相当于多次调用直接插入排序,每一次的增量保持互素,并且最后一个增量一定位1,为1才能保证其完全有序   时间复杂度O(n^1.3~1.5) 空间复杂度O(1)  不稳定

void InsertSort(int arr[], int len)
{
	assert(arr != NULL);
	if (arr == NULL)
	{
		return;
	}

	int count = 0;
	int tmp;
	int j;//将j的生存周期提高,保证break后的的代码arr[j+1] = tmp;有效
	for (int i = 1; i < len; i++)//每次从待排序队列中取的值
	{
		tmp = arr[i];//用tmp保存待插入的值
		for (j = i - 1; j >= 0; j--)//从右向左找不比tmp大的值
		{
			if (arr[j] > tmp)//如果比tmp大  则向右放一格
			{
				arr[j + 1] = arr[j];
				count++;
			}
			else//如果不比tmp大
			{
				break;
			}
		}

		arr[j + 1] = tmp;
	}
	printf("swap: %d\n", count);
}
void Show(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int count2 = 0;
static void Shell(int arr[], int len, int gap)
{
	int tmp;
	int j;//将j的生存周期提高,保证break后的的代码arr[j+1] = tmp;有效
	for (int i = gap; i < len; i++)//每次从待排序队列中取的值
	{
		tmp = arr[i];//用tmp保存待插入的值
		for (j = i - gap; j >= 0; j = j - gap)//从右向左找不比tmp大的值
		{
			if (arr[j] > tmp)//如果比tmp大  则向右放一格
			{
				arr[j + gap] = arr[j];
				count2++;
			}
			else//如果不比tmp大
			{
				break;
			}
		}

		arr[j + gap] = tmp;
	}
}
void ShellSort(int arr[], int len)
{
	//assert

	int gap[] = { 5, 3, 1 };
	int lengap = sizeof(gap) / sizeof(gap[0]);
	for (int i = 0; i < lengap; i++)
	{
		Shell(arr, len, gap[i]);//5 3 1
	}
}
int main()
{

	int arr[] = { 2,6,8,3,15,21,99,53,1,9 };
	int len = sizeof(arr) / sizeof(arr[0]);

	//InsertSort(arr, len);
	ShellSort(arr, len);
	printf("swap = %d\n", count2);
	Show(arr, len);

	return 0;
}

3.希尔排序
1.直接插入排序(简单排序)
从待排序队列中依次取出,放到我们已经排序队列中。
当使用规模很小的时候,待排序队列越有序,则直接插入排序越优解。
2. 八大排序:算法的描述,算法的实现,算法的评 价(时间复杂度,空间复杂度,稳定性),第一个排序算法:直接插入排序,每次向已排序好的队列中插入新值,再次保持有序
希尔排序(shell):一种特殊的直接插入排序,增将数组要求,一定要以1结尾,尽可能互素,希尔排序的时间复杂度是一个特殊数值,O(n1.3~n1.5),时间复杂度不固定,时间复杂度比直接插入排序小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值