[数据结构 -- 手撕排序第一篇] 插入排序

这篇具有很好参考价值的文章主要介绍了[数据结构 -- 手撕排序第一篇] 插入排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、常见的排序算法

2、插入排序的思路

2.1 基本思想

2.2 直接插入排序

2.2.1 单趟排序的思路

2.2.2 单趟排序代码实现

3、插入排序代码

4、插入排序+打印测试

5、插入排序的时间复杂度

5.1 最坏情况

5.2 最好情况

6、直接插入排序的特性总结


1、常见的排序算法

[数据结构 -- 手撕排序第一篇] 插入排序,排序算法,排序算法,算法,数据结构

 

2、插入排序的思路

2.1 基本思想

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

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

[数据结构 -- 手撕排序第一篇] 插入排序,排序算法,排序算法,算法,数据结构

 

2.2 直接插入排序

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

2.2.1 单趟排序的思路

我们将数组中最后一个元素的下标记为end,每次要插进来的数字先放在end+1位置上,再用一个临时变量tmp将这个数字保存起来,从end开始依次往前比较,如果tmp比end小,就让end往后移一位,tmp再与end-1,end-2……不断比较,当tmp大于某个位置的元素时,就将tmp插入到该位置下标+1的位置上,单趟排序就完成了。

[数据结构 -- 手撕排序第一篇] 插入排序,排序算法,排序算法,算法,数据结构

 

2.2.2 单趟排序代码实现

int tmp = a[end + 1];
while (end >= 0)
{
    if (a[end] > tmp)
    {
        a[end + 1] = a[end];
        end--;
    }
    else
    {
        break;
    }
}
a[end + 1] = tmp;

我们代码中有一个巧妙的写法,在 a[end] < tmp 时,跳出循环,再将tmp插入到 a[end+1] 位置。这样能同时解决 a[end] < tmp 与 第一个元素<tmp 的插入。

3、插入排序代码

插入排序是在单趟排序的基础上,将整个数组排序一遍,我们给但趟排序的代码外加上一层循环,就实现了插入排序。

for (int i = 1; i < n; i++)
{
    int end = i - 1;
    int tmp = a[i];

    while (end >= 0)
    {
        if (a[end] > tmp)
        {
            a[end + 1] = a[end];
            end--;
        }
        else
        {
            break;
        }
    }
    a[end + 1] = tmp;
}

4、插入排序+打印测试

void Print(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 = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = a[i];

		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
void TestInsert()
{
	int a[] = { 9,8,7,6,5,4,3,2,1 };
	InsertSort(&a, sizeof(a) / sizeof(int));
	Print(&a, sizeof(a) / sizeof(int));
}
int main()
{
	TestInsert();
	return 0;
}

效果展示:

[数据结构 -- 手撕排序第一篇] 插入排序,排序算法,排序算法,算法,数据结构

 

5、插入排序的时间复杂度

5.1 最坏情况

最坏的情况就是逆序,这时就是最坏的情况,时间复杂度为:O(N^2)

5.2 最好情况

最好情况就是顺序有序,我们不需要调整,只需要遍历一遍数组,时间复杂度:O(N)

6、直接插入排序的特性总结

1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定文章来源地址https://www.toymoban.com/news/detail-520158.html

到了这里,关于[数据结构 -- 手撕排序第一篇] 插入排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)

    目录 1、常见的排序算法 1.1 交换排序基本思想 2、快速排序的实现方法 2.1 基本思想 3 hoare(霍尔)版本 3.1 实现思路 3.2 思路图解 3.3 为什么实现思路的步骤2、3不能交换 3.4 hoare版本代码实现 3.5 hoare版本代码测试 4、挖坑法 4.1 实现思路 4.2 思路图解 4.3 挖坑法代码实现 4.4 挖坑

    2024年02月16日
    浏览(31)
  • 【数据结构】手撕排序

    🔥 博客主页 : 小羊失眠啦. 🎥 系列专栏 : 《C语言》 《数据结构》 《Linux》 《Cpolar》 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 排序 :所谓排序就是使一串记录,按照其中的某个或某些的大小, 递增或递减 的排列起来的操作。排序算法,就是如何使得记录按照要求

    2024年02月05日
    浏览(34)
  • 【数据结构】手撕排序NO.1----排序初识

    目录  一. 前言 二. 排序的概念及运用         2.1 排序的概念         2.2 排序的运用         2.3 常见的排序算法 三. 冒泡and选择排序         3.1 冒泡排序         3.2 选择排序 四. 各大排序算法的复杂度和稳定性        从本期开始,我们的数据结构将迎来一个新的

    2024年02月16日
    浏览(43)
  • [数据结构 -- 手撕排序第三篇] 冒泡排序

    目录 1、常见的排序算法 1.1 交换排序基本思想 2、冒泡排序的实现 2.1 基本思想 2.2 单趟排序 2.2.1 单趟排序分析 2.2.2 单趟排序实现代码 3、冒泡排序完整代码实现 3.1 思路分析 3.2 代码实现 4、时间复杂度 5、优化算法 5.1 优化算法思路 5.2 优化算法代码实现 6、冒泡排序的特性总

    2024年02月13日
    浏览(33)
  • [ 数据结构 -- 手撕排序算法第二篇 ] 冒泡排序

    手撕排序算法系列之:冒泡排序。 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括 插入排序 , 冒泡排序 ,希尔排序,选择排序,堆排序,快速排序,归并排序等。 大家可以点击此链接阅读其他排序算法:排序算法_大合集(data-structure_Sort) 本篇主要来手撕冒

    2024年02月11日
    浏览(36)
  • 【数据结构】手撕归并排序(含非递归)

    目录 一,归并排序(递归) 1,基本思想  2,思路实现 二,归并排序(非递归) 1,思路实现 2,归并排序的特性总结: 1,基本思想 归并排序 (MERGE-SORT) 是建立在 归并操作 上的一种 有效的排序算法 ,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用; 将 已

    2024年02月08日
    浏览(34)
  • [数据结构 -- 手撕排序算法第七篇] 递归实现归并排序

    目录 1、归并的思想 2、归并排序的思想 2.1 基本思想 2.2 图解分析 3、归并排序递归版本代码实现 3.1 代码解析 3.2 注意事项 3.2.1错误划分:[begin, mid-1],[mid, end] 3.2.2 正确划分:[begin, mid], [mid+1, end] 4、归并排序的测试 5、时间复杂度、空间复杂度分析 5.1 时间复杂度 5.2 空间复杂

    2024年02月16日
    浏览(35)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(39)
  • 数据结构与算法之手撕排序算法

    为什么要学习排序算法? 根据统计,早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法,各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见,我们为什么还要自己动手实现呢?虽然经典算法要动手写写加深印象的道理都懂,

    2023年04月16日
    浏览(32)
  • 数据结构:手撕图解七大排序(含动图演示)

    插入排序分为直接插入排序和希尔排序,其中希尔排序是很值得学习的算法 希尔排序的基础是直接插入排序,先学习直接插入排序 直接插入排序类似于打扑克牌前的整牌的过程,假设我们现在有2 4 5 3四张牌,那么应该怎么整牌? 方法很简单,把3插到2和4中间,这样就完成了

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包