【排序算法】插入排序(C语言)

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

【排序算法】—— 插入排序

一、插入排序的基本思想

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

​ 插入排序的算法非常简单,依次对每一个元素进行单趟排序就行了,由于要前一个数比较则只需要从1开始遍历n-1次,代码如下:

void InsertSort(int* arr, int size)
{
	int i = 0;
	for (i = 1; i < size; i++)
	{
		//单趟排序
	}
}

二、插入排序的单趟排序

​ 直接插入排序的单趟排序是将当前数值插入到有序序列的指定位置,我们通过当前位置开始从后往前遍历数组,将数值向前移动,直到移动到该数据的指定位置,就完成单趟排序。

​ 由于被插数组是有序的,所以可以顺序向前比较找到插入位置,这种方法称为直接插入排序,也可以通过二分查找找到插入位置,称为二分法插入排序

1. 直接插入排序

​ 每一次比较都将待排数据向前移动一格,直到插入到指定位置

  1. 如图,当前待排数据为i指向的数据4,则要将4插入到[2 3 5 6 8]中使其构成有序数组,变量end从当前位置开始遍历

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. end向前移动,4比8小,则8向后移动一格,4插入到8的前面

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. end接着向前移动,与前一个进行比较,4比6小,则6向后移动一位,4插入到6的前面

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. end继续遍历,直到遇到比4小的数停止插入,此时单趟排序排序完成

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

void InsertSort(int* arr, int size)
{
	int i = 0;
	for (i = 1; i < size; i++)
	{
	    int end = i;
        int temp = arr[end];	//记录待排数值
        while (end > 0)
        {
            if (arr[end-1] > temp)	//若前一个数大于待排数值,则后移一位
            {
                arr[end] = arr[end-1];
            	end--;
            }
            else
            {
                break;
            }
        }
        // arr[end-1] = temp;是之前的错误,现已修正
        arr[end] = temp;	//将数据放入插入位置
	}
}

2. 二分法插入排序

​ 利用二分查找法查找出插入位置,并将有序数组中插入位置后的数据后移一位,空出插入位置插入数据

  1. 定义leftright指针,分别指向有序数组的开头和末尾,计算出中间数据的值与待排数据4比较

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. 中间数值5大于4,则rightmid-1处开始,查找区间缩小一半,计算出中间值

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. 中间值2小于4,则leftmid+1处开始,计算出中间值

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. 中间值3小于4,则leftmid+1处开始,但是此时left大于right,所以循环停止,left的位置就是插入位置

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

  1. 将待排数据之前,left后的数据全部后移一位,空出插入位置,并插入数据,排序完毕

c语言插入排序,# 查找排序算法,排序算法,c语言,算法

void BInsertSort(int* arr, int size)
{
    int i = 0;
	for (i = 1; i < size; i++)
	{
        int left = 0;
        int right = i - 1;
        
        //查找插入位置
        while (left <= right)
        {
            int mid = (left + right) / 2;
            if (arr[i] < arr[mid])
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        
        //后移数据并插入
        int temp = arr[i];
        for (right = i; right > left; right--)
        {
            arr[right] = arr[right-1];
        }
        arr[left] = temp;
	}
}

三、插入排序的特点和效率

1. 插入排序的特点

直接插入排序:

  1. 越有序的数组单趟移动的次数越少,完全有序的数组时间复杂度只有 O ( n ) O(n) O(n)
  2. 插入排序是稳定的排序(相同元素排序时不破坏原来的位置,不稳定对结构体类型数据有影响)

二分法插入排序:

  1. 二分法插入排序面对大量数据时能减少数据的比较次数,有效提高时间效率
  2. 二分法插入排序也是稳定的

2. 插入排序的效率

​ 时间复杂度: O ( n 2 ) O(n^2) O(n2)

​ 空间复杂度: O ( 1 ) O(1) O(1)文章来源地址https://www.toymoban.com/news/detail-816993.html

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

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

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

相关文章

  • C语言--直接插入排序【排序算法|图文详解】

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

    2024年01月19日
    浏览(43)
  • 用C语言进行学生成绩排序(插入排序算法)

    从今天开始我们就要开始学习排序算法啦! 排序,就是重新排列表中的元素,使表中的元素满足按有序的过程。为了查找方便,通常希望计算机中的表是按有序的。 除了我们之前了解的时间复杂度和空间复杂度来判断一个算法的好坏之外,在排序算法这里我们引

    2024年02月15日
    浏览(42)
  • Java高级语言实现插入排序算法

    【引言】 插入排序算法是一种简单且常用的排序算法。它通过依次将未排序的元素插入已排序序列中的正确位置来达到排序的目的。本文将使用Java高级语言实现插入排序算法,并讲解其核心思想和代码实现。 【算法思想】 插入排序的核心思想是通过构建有序序列,对于未排

    2024年02月11日
    浏览(47)
  • 用C语言实现插入排序算法

    1.设计思路 用插入排序对长度为n的待排序数组A进行排序的伪代码(在代码中,A中元素的数目n用A.length来表示)。 伪代码如下: 2.源代码 3.运行结果 第一行的5为要排序的元素个数,12,32,6,67,43为要排序的数,排序过程为6插到最前面,43插到67前面,即可完成从小到大的

    2024年02月14日
    浏览(45)
  • c语言编写排序算法——直接插入排序(附详细代码)

    记号说明: a[k:r] 是指序列 a[k] a[k+1] a[k+2] … a[r] 。 为了讨论简单,假设待排序的每个记录是一个整数,这个整数就是排序码。 直接插入排序 :先将第一个记录看作是一个有序的记录序列,然后从第二个记录开始,依次将未排序的记录插入到这个有序的记录序列中去,直到整

    2024年02月11日
    浏览(42)
  • 插入排序和希尔排序:用C语言打造高效的排序算法

    插入排序的思路就像是你在整理一堆扑克牌。你先拿起第一张牌,然后拿起第二张牌,把它插入到合适的位置,使得你手上的两张牌是有序的。接着,你再拿起第三张牌,也把它插入到合适的位置,使得你手上的三张牌是有序的。依此类推,直到你把所有的牌都拿到手上,这

    2024年02月16日
    浏览(37)
  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

    2024年02月13日
    浏览(42)
  • 折半插入排序算法详解之C语言版

    折半插入排序是插入排序方法中一种,相比较与直接插入排序算法,减少了排序过程中比较次数,也是一种常用的排序算法。 折半插入排序算法基本原理是将折半查找方法与直接插入排序方法相结合,也就是在每一次插入新元素时,利用折半查找方法找到其待插入的位置。

    2024年02月12日
    浏览(39)
  • 二叉排序树的查找、插入、删除

    目录 二叉排序树的定义 二叉排序树的查找 二叉排序树的插入 二叉排序树的定义 二叉排序树(Binary Sort Tree, BST),也称二叉查找树。 二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: 1) 若左子树非空,则左子树上所有结点均小于根结点的关键

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

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

    2024年01月24日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包