• 直接插入排序算法详解之C语言版


    一、算法原理

    插入排序属于稳定排序法,是一种常用的排序算法。
    其基本原理就是把一个数据插入到一组已经排好序的数列中,得到仍是有序的数列。
    例如:已经有如下排好序的数组:
    在这里插入图片描述
    将数据15插入到该数组中得到新数组,即将15插入到数组下标为5的位置。
    在这里插入图片描述
    那么位置5是怎么得到的呢,且行且学习。
    记待插入数据为data,则直接插入排序的基本思想是从数组的最后一个元素开始依次向前比较,如果data小,则数组元素后移,否则,插入到最后一次比较的元素之后。
    为了提高算法的效率,可以启用哨兵位,即下标为0的位置,将data存入到该位置。
    以上述待插入数据和数组为例演示直接插入排序的过程如下:
    Step_1:将15存入哨兵位
    在这里插入图片描述
    Step_2:将哨兵位元素与数组最后一个元素19进行比较,15小,则19后移
    在这里插入图片描述
    Step_3:将哨兵位元素与数组元素18进行比较,15小,则18后移
    在这里插入图片描述
    Step_4:将哨兵位元素与数组元素14进行比较,15大,则存入元素且之后,插入操作结束
    在这里插入图片描述

    二、算法

    1.将一个数据使用直接插入法插入到一组排好序的数组的算法:
    Step 1: 将待插入数据存入哨兵位,记数组最大下标为k,其位置上的元素为当前元素;
    Step 2:将哨兵位元素与当前元素进行比较,
    如果哨兵位元素大,则将哨兵位元素存入k+1位置,结束插入操作;
    否则转入Step 3;
    Step 3:当前元素后移一位,然后k–,转Step 2.
    2.对一组数据使用直接插入法排序,则循环调用上述算法即可,算法时间复杂度是O(n^2)。
    三、C/C++程序

    **1. 直接插入排序算法之C语言版**
    /*
    功能:使用直接插入排序法将数据data插入到数组arr中
    输入参数:
    	arr,按照元素值从小到大排序的数组
    	data,待插入的数据
    输出参数:
    	arr,插入新数据且排好序的数组
    返回值:无 
    */
    void InsertSort( Array &arr, int data )
    {
    	int k;
    	if( arr.length >= MaxLength )
    	{
    		printf( "数组已满,不能插入当前元素: %d", data );
    		return;
    	}
    	arr.data[0] = data; 
    	for( k = arr.length; ;k-- )
    	{
    		if( arr.data[0] < arr.data[k] )
    		{
    			arr.data[k+1] = arr.data[k];
    		}
    		else
    		{
    			arr.data[k+1] = arr.data[0];
    			break;
    		}
    	}
    	arr.length++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.完整的代码(仅供参考)

    #include"stdio.h"
    #define MaxLength 100
    
    typedef struct
    {
    	int data[MaxLength];//排序数组 
    	int length;         //数组的实际长度 
    }Array;
    
    void InputData( int &count, int arrt[] );
    void InsertSort( Array &arr, int data );
    
    int main()
    {
    	int count = 0, k, i;
    	int arrt[MaxLength];
    	InputData( count, arrt );
    	Array arr;
    	arr.length = 0;
    	for( k = 1; k <= count; k++ )
    	{
    		InsertSort( arr, arrt[k] );
    		printf( "No %d sorting( %3d ): ", k, arrt[k] );
    		for( i = 1; i <= arr.length; i++ )
    		{
    			printf( "%5d", arr.data[i] );
    		}
    		printf( "\n" );
    	}
    	
    	return 0;
    } 
    //功能:使用直接插入排序法将数据data插入到数组arr中
    void InsertSort( Array &arr, int data )
    {
    	int k;
    	if( arr.length >= MaxLength )
    	{
    		printf( "数组已满,不能插入当前元素: %d", data );
    		return;
    	}
    	arr.data[0] = data; 
    	for( k = arr.length; ;k-- )
    	{
    		if( arr.data[0] < arr.data[k] )
    		{
    			arr.data[k+1] = arr.data[k];
    		}
    		else
    		{
    			arr.data[k+1] = arr.data[0];
    			break;
    		}
    	}
    	arr.length++;
    }
    //从键盘获取数据,count表示数据个数,arrt是存储数据的数组
    void InputData( int &count, int arrt[] )
    {
    	int i = 0, data;
    	while( 1 )
    	{
    		printf( "input an positive integer(end of -1)" );
    		scanf( "%d", &data );
    		if( data == -1 )
    		{
    			break;
    		}
    		else
    		{
    			arrt[++i] = data;
    		}
    	}
    	count = i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    3.测试用例
    测试一
    在这里插入图片描述
    测试二(有相同数据):
    在这里插入图片描述

  • 相关阅读:
    电子电路设计基本概念100问(六)【学习目标:原理图、PCB、阻抗设计、电子设计基本原则、基本原器件等】
    科技的成就(三十八)
    基于springboot+vue的戒毒所人员管理系统毕业设计源码251514
    动态规划之子数组系列
    快速排序思想
    产品周报第35期|APP端学习门户上线、每日一练新增编程题型、专栏显示订阅来源……
    常用的编辑器安装、配置、插件
    web需求记录
    [C题目]力扣142. 环形链表 II
    html导出word
  • 原文地址:https://blog.csdn.net/sunnyoldman001/article/details/126911838