插入排序-C语言实现

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

🥰前言

        🍔在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法,下面我们来看一看插入排序的特点与效率怎么样。😍

🍪 插入排序

🍟英文名:Insertion Sort

原理

       🍁 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

        🍔趣味解释:插入排序操作类似于摸牌并将其从大到小排列。每次摸到一张牌后,根据其点数插入到确切位置。

插入排序-C语言实现

         🍔如上图:表示的是摸到梅花7后进行插入的过程。忽略最右边的梅花10,相当于一开始7在最右边,然后逐个与左边的排相比较(当然左边的牌早已排好顺序),将其放置在合适的位置。当摸到后面的牌后重复上述过程即可。

现实逻辑

        ① 从第一个元素开始,该元素可以认为已经被排序
        ② 取出下一个元素,在已经排序的元素序列中从后向前扫描
        ③如果该元素(已排序)大于新元素,将该元素移到下一位置
        ④ 重复步骤③,直到找到已排序的元素小于或者等于新元素的位置
        ⑤将新元素插入到该位置后
        ⑥ 重复步骤②~⑤

动图解释

插入排序-C语言实现

时间复杂度

        🍟最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O(n)

        🍟最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O()

        🚨因此直接插入排序的平均时间复杂度为O()

空间复杂度

🥝这个很好想,也就是每次遍历空间复杂度都是O(1)

代码实现

#include <stdio.h>
//插入排序
void InsertSort(int arr[], int n)
{
	int i = 1;
	for (i = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = arr[i];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}
//打印数据
void print(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 2,3,5,1,6,9,0,4,7,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("排序前:");
	print(arr, sz);
	InsertSort(arr, sz);
	printf("排序后:");
	print(arr, sz);
	return 0;
}

运行结果

插入排序-C语言实现

算法优化改进

方法一

场景分析:

⭕直接插入排序每次往前插入时,是按顺序依次往前查找,数据量较大时,必然比较耗时,效率低。

⭕改进思路: 在往前找合适的插入位置时采用二分查找的方式,即折半插入。

        💧二分插入排序相对直接插入排序而言:平均性能更快,时间复杂度降至O(NlogN),排序是稳定的,但排序的比较次数与初始序列无关,相比直接插入排序,在速度上有一定提升。逻辑步骤:

        ① 从第一个元素开始,该元素可以认为已经被排序
        ② 取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置
        ③将新元素插入到该位置后
        ④ 重复上述两步

改进代码

// 插入排序改进:二分插入排序
void BinaryInsertSort(int arr[], int len)   
{   
    int key, left, right, middle;   
    for (int i=1; i<len; i++)   
    {   
        key = a[i];   
        left = 0;   
        right = i-1;   
        while (left<=right)   
        {   
            middle = (left+right)/2;   
            if (a[middle]>key)   
                right = middle-1;   
            else   
                left = middle+1;   
        }   

        for(int j=i-1; j>=left; j--)   
        {   
            a[j+1] = a[j];   
        }   

        a[left] = key;          
    }   
}

方法二

场景分析

插入排序对几乎已排好序的数据操作时,效率很高,可以达到线性排序的效率。

⭕插入排序在每次往前插入时只能将数据移动一位,效率比较低。

思路:

        🍁先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

        改进思路二的方法实际上就是希尔排序。在这里只给出思路,在后续希尔排序中再做具体讲解。传送门在这里—>>🥰 希尔排序🥰 文章来源地址https://www.toymoban.com/news/detail-491661.html

到了这里,关于插入排序-C语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 对链表使用插入排序的C语言实现示例

    在这个示例中,我们定义了 insertionSortList 函数用于对链表进行插入排序。然后,在 main 函数中创建了示例链表,调用 insertionSortList 函数进行排序,并打印结果。最后,释放了链表节点的内存。 插入排序的时间复杂度为O(n^2),在某些情况下比归并排序的O(nlogn)更有效。 特殊情

    2024年02月20日
    浏览(26)
  • 数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)

    目录 插入排序  希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare法 挖坑法 前后指针法 快排特性总结 三数取中优化 小区间优化 快排非递归 归并排序 归并排序非递归 计数排序 总结 OJ测试 1、元素集合越接近有序,直接插入排序算法的时间效率越高 2、时间复杂度:O(N^2

    2023年04月09日
    浏览(61)
  • 【数据结构】—从直接插入排序升级到希尔排序究极详解(含C语言实现)

                                            食用指南:本文在有C基础的情况下食用更佳                                          🔥 这就不得不推荐此专栏了: C语言                                         ♈️ 今日夜电波:透明で透き通って何にでもなれそ

    2024年02月08日
    浏览(39)
  • C语言实现八大排序算法(详解插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序(递归和非递归)、归并排序(递归和非递归)和计数排序)

    本篇文章使用C语言实现了数据结构中常见的八大排序算法,它们分别是 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序 。在排序算法的实现过程中,每种算法都有其独特的特点和适用场景。插入排序通过逐步构建有序序列来排序,希尔

    2024年01月24日
    浏览(38)
  • 【排序算法】插入排序(C语言)

    【排序算法】—— 插入排序 ​ 直接插入排序是一种简单的插入排序法,对数组进行一个遍历,每次都对待排的数据按照大小顺序插入到一个有序数组中的特定位置,直到所有的数据全部插入完毕,就得到一个有序数列。 ​ 插入排序的算法非常简单,依次对每一个元素进行

    2024年01月23日
    浏览(30)
  • C语言--直接插入排序【排序算法|图文详解】

    直接插入排序又叫简单插入排序,是一种 简单直观 的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法描述: 假设要排序的列表为arr,列表的第一个元素arr[0]默认已经是有序序列。 从第二个元素开始,即arr[

    2024年01月19日
    浏览(30)
  • 八大排序算法(C语言版)之插入排序

    八大排序算法: 超链接: 插入排序 选择排序 交换排序 归并排序 非比较排序 排序:所谓排序,就是使一串记录, 按照其中的某个或某些的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些

    2024年02月07日
    浏览(36)
  • 插入排序详解(C语言)

    前言 插入排序是一种简单直观的排序算法,在小规模数据排序或部分有序的情况下插入排序的表现十分良好,今天我将带大家学习插入排序的使用。let’s go ! ! ! 插入排序 插入排序的基本思想是将待排序的序列分为已排序和未排序两部分。初始时,将第一个元素视为已排序序

    2024年02月04日
    浏览(19)
  • C语言插入排序

    本文主要讲解插入排序中的直接插入排序和希尔排序。 插入排序基本思想就是在一个已经有序的数列里,插入一个数据,进行排序使得插入数据后仍然有序。 1.1基本思想 直接插入排序是一种简单的插入排序法,其基本思想是 把待排序的数值按照大小顺序逐个插入到一个已经

    2024年02月10日
    浏览(22)
  • 【C语言】插入排序

    直接插入排序就是将待排序的记录按照它的关键码值插入到一个已经排好序的有序序列中,直到所有的记录都插入完,得到一个新的有序序列。 插入排序的思想就像我们平时玩扑克牌理牌时一样,将每张牌逐个插入到一个有序的牌的序列里,最终所有的牌都是有序的。 代码

    2024年02月08日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包