【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录

[1 -> 排序的概念及其运用](#1 -> 排序的概念及其运用)

[1.1 -> 排序的概念](#1.1 -> 排序的概念)

[1.2 -> 常见的排序算法](#1.2 -> 常见的排序算法)

[2 -> 插入排序](#2 -> 插入排序)

[2.1 -> 基本思想](#2.1 -> 基本思想)

[2.2 -> 直接插入排序](#2.2 -> 直接插入排序)

[2.2.1 -> 代码实现](#2.2.1 -> 代码实现)

[2.3 -> 希尔排序(缩小增量排序)](#2.3 -> 希尔排序(缩小增量排序))

[2.3.1 -> 代码实现](#2.3.1 -> 代码实现)


1 -> 排序的概念及其运用

1.1 -> 排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序不变,即在原序列中,r[ i ] = r[ j ],且r[ i ] 在 r[ j ]之前,而在排序后的序列中,r[ i ] 仍在 r[ j ]之前,则称这种排序算法是稳定的;否则称为不稳定。

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2 -> 常见的排序算法

2 -> 插入排序

2.1 -> 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

实际中我们玩扑克牌时,就用到了插入排序的思想。

2.2 -> 直接插入排序

当插入第i(i >= 1)个元素时,前面的arr[0],arr[1],arr[2]......,arr[i - 1]已经排好序,此时用arr[i]的排序码与arr[i - 1],arr[i - 2]......的排序码顺序进行比较,找到插入位置即将arr[i]插入,原来位置上的元素顺序后移。

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高;
  2. 时间复杂度:
  3. 空间复杂度:,他是一种稳定的排序算法;
  4. 稳定性:稳定;

2.2.1 -> 代码实现

复制代码
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 打印
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);

	printf("\n");
}

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

			a[end + 1] = tmp;
		}
	}
}

void TestInsertSort()
{
	int a[] = { 9, 2, 6, 1, 7, 3 ,0, 5, 8, 4 };
	PrintArray(a, sizeof(a) / sizeof(int));
	InsertSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

int main()
{

	TestInsertSort();

	return 0;
}

2.3 -> 希尔排序(缩小增量排序)

希尔排序法又称缩小增量法。希尔排序的基本思想就是:先选定一个整数,把待排序文件中所有记录分成各子序列,并对每一组内的记录进行排序,重复上述分组和排序的工作。当gap = 1时,完成排序。

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序了,这样就会很快。整体而言,可以达到优化的效果。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算。
  4. 稳定性:不稳定。

2.3.1 -> 代码实现

复制代码
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

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

			a[end + 1] = tmp;
		}
	}
}

// 希尔排序
void ShellSort(int* a, int n)
{
	int gap = n;
	for (int 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;
	}
}

void TestShellSort()
{
	int a[] = { 9, 2, 6, 1, 7, 3 ,0, 5, 8, 4 };
	PrintArray(a, sizeof(a) / sizeof(int));
	InsertSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));

	ShellSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

int main()
{

	TestShellSort();

	return 0;
}

感谢大佬们的支持!!!

互三啦!!!

相关推荐
武子康7 分钟前
大数据-92 Spark 深入解析 Spark Standalone 模式:组件构成、提交流程与性能优化
大数据·后端·spark
青梅主码19 分钟前
麦肯锡最新发布报告《想打破生产力天花板吗?重新思考完成工作的方式》:与其一味调整组织结构,不如从根本上简化工作流程,释放更大价值
后端
Python私教23 分钟前
源滚滚Rust全栈班v1.02 无符号整数详解
开发语言·后端·rust
Brookty26 分钟前
【算法】双指针(二)复写零
学习·算法
绝无仅有38 分钟前
面试总结之Nginx 经验常见问题汇总第二篇
后端·面试·github
胖达不服输42 分钟前
「日拱一码」081 机器学习——梯度增强特征选择GBFS
人工智能·python·算法·机器学习·梯度增强特征选择·gbfs
这里有鱼汤1 小时前
分享7种常见的量化交易策略
后端
绝无仅有1 小时前
面试实战总结之Nginx配置经验第一篇
后端·面试·github
初级炼丹师(爱说实话版)1 小时前
2025算法八股——深度学习——优化器小结
人工智能·深度学习·算法
10001hours1 小时前
C语言第12讲
c语言·开发语言