IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 排序算法之插入排序(直接插入排序、折半插入排序、希尔排序) -> 正文阅读

[数据结构与算法]排序算法之插入排序(直接插入排序、折半插入排序、希尔排序)

插入排序

在排序过程中,根据数据元素是否完全在内存中,可以将排序分成两类:

  1. 内部排序:是指在排序期间元素全部存放在内存中的排序。内部排序在执行过程中都要进行两种操作:比较和移动。
  2. 外部排序:是指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断地在内、外存之间移动的排序。外部排序还要关注如何使读/写磁盘次数更少。

插入排序的思想是每次将一个待排序的记录按其关键字大小插入前面已排好序的子序列,直到全部记录插入完成。
插入排序思想可以引申为三种重要的排序算法:直接插入排序、折半插入排序、希尔排序

直接插入排序

理论

直接插入是一个稳定的排序方法,适用于顺序存储和链式存储的线性表。
算法的思想是:依次将每个元素插入到前面已经排序好的子表的相应位置中。

算法实现

void InserSort(ElemType A[], int n)
{
	int i, j;
	for(i=2;i<=n;i++)
		if (A[i] < A[i - 1])
		{
			A[0] = A[i];
			for (j = i - 1; A[0] < A[i]; --j)
				A[j + 1] = A[j];
			A[j + 1] = A[0];
		}
}

折半插入排序

折半插入排序将比较和移动操作分离,即先折半查找出元素的待插入位置,然后统一地移动待插入位置之后的所有元素。

算法实现

void half_Insert(ElemType A[], int n)
{
	int i, j, low, high, mid;
	for (i = 2; i <= n; i++)
	{
		A[0] = A[i];
		low = 1;
		high = i - 1;
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (A[mid] > A[0])
				high = mid - 1;
			else
				low = mid + 1;
		}
		for (j = i - 1; j >= high + 1; --j)
			A[j + 1] = A[j];

		A[high + 1] = A[0];
		
	}
}

希尔排序

概念

希尔排序的基本思想是:先将排序表分割成若干形如L[i,i+d,i+2d…i+kd]的“特殊”子表,即把相隔某个“增量”的记录组车一个子表,对各个子表分别进行直接插入排序,当整个表中的元素已经基本有序时,再对整个表进行一次直接插入排序。
一般情况下,第一个增量一般选用n=总元素数/2;

算法实现

void shell_Sort(ElemType A[],int n)
{
	int i, j, dk;
	for (int dk = n / 2; dk >= 1; dk--)
		for(int i=dk+1;i<=n;i++)
			if (A[i] < A[i - dk])
			{
				A[0] = A[i];
			}
	for (int j = i - dk; j > 0 && A[0] < A[j]; j -= dk)
		A[j + dk] = A[j];
	A[j + dk] = A[0];


}

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏
订阅专栏后,可以在微信公众号上私聊我,直接发给你源码。
或者关注公众号。
在这里插入图片描述

编写不易,感谢支持。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:40:50  更:2021-08-11 12:44:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:25:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码