关键词搜索

源码搜索 ×
×

C语言---插入排序(直接插入和希尔)

发布2023-01-31浏览400次

详情内容


前言

插入排序一般分为两种,一种直接插入排序,另一种则是希尔排序

一、直接插入排序

1.简介

  直接插入排序是一种简单的排序方法,基本操作就是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的序列。
  时间复杂度为:O(n²)    空间复杂度:O(1)      稳定性:稳定
  生活中最明显的例子就是,打扑克,把牌洗混,然后抓牌,以第一张为基础,然后将后面的牌依次插入,最后得到有顺序的牌面。

    2.算法思路

    1. 待排的序列看作成2个部分,一部分为有序,另一部分为无序。
    2. 我们将第一个元素看作有序序列,第二个到最后都是无序序列。
    3. 将无序序列的每一个元素依次插入到有序序列的合适位置。在这里插入图片描述
      讲解:有一个待排序序列:【2,5,8,3】
      我们将第一个2看成已经排序好的序列,即有序序列,从第二个元素最后一个元素看作是无序序列。
      排序元素有序元素大,则插在有序元素后,反之,插在有序元素

    3.代码实现

    #include<stdio.h>
    #define num 12
    void insert_sort(int* a, int n)
    {
    	
    	for (int i = 0; i < n - 1; ++i)
    	{
    		// 将x插入[0, end]有序区间
    		int end = i;
    		int x = a[end + 1];
    		while (end >= 0)
    		{
    			if (a[end] > x)
    			{
    				a[end + 1] = a[end];
    				end--;
    			}
    			else break;
    		}
    		a[end + 1] = x;
    	}
    }
    int main()
    {
    	int arr[num] = { 3,1,4,5,2,7,9,0,8,10,11,6 };
    	printf("\n初始序列\n");
    	for (int i = 0; i < num; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	insert_sort(arr, num);
    	printf("\n排序后序列\n");
    	for (int i = 0; i < num; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    }
    
      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

    运行结果:
    在这里插入图片描述

    二、希尔排序

    1.简介

    希尔排序是在直接插入排序的基础上做了较大的改进,是将整个无序序列分割成若干个的子序列分别进行插入排序。
    简单而言:将数组预排序,接近有序。
    元素为逆排序时,时间复杂度最差为O(n²) 空间最差复杂度: O(n)
    平均时间复杂度为O(nlog2n) 平均空间复杂度(O(1))
    稳定性:差

    2.算法思路

    1. 先取一个小于数组数的整数x作为第一个增量,把文件的全部记录分成x个组。
    2. 所有距离为x的倍数的值在同一组里,然后进行直接插入排序,变成有序序列。
    3. 取一个小于x的 x1 作为第二个增量,重复上述分组和排序,直到增量为1。
      注:当增量为1时,相当于所有记录放在同一组里进行直接插入排序

    来自百度
    假设有一组{70,30,40,10,80,20,90,100,75,60,45}无序序列

    第一趟:增量gap为3时,即距离为3的元素放在一组,可以分成3组,分别是{70,10,90,60},{30,80,100,45},{40,20,75},按照直接插入排序对每个组进行排序。
    第二趟:gap变成了2,接着和第一趟一样,最后也是按照直接插入排序对每个组进行排序。
    第三趟:gap为1,后续操作也是如此…

    3.代码实现

    代码如下:

    #include<stdio.h>
    #define num 12
    void ShellSort(int* a, int n)
    {
    	int gap = n;	
    	while (gap > 1)
    {
    	gap = gap / 3 + 1; 
    		for (int i = 0; i < gap; i++)
    		{
    			for (int j = i; j < n - gap; j += gap)
    			{
    				int end = j;
    				int x = a[end + gap];
    				while (end >= 0)
    				{
    					if (a[end] > x)
    					{
    						a[end + gap] = a[end];
    						end -= gap;
    					}
    					else break;
    				}
    				a[end + gap] = x;
    			}
    		}
    	}
    }
    int main()
    {
    	int arr[num] = { 3,1,4,5,2,7,9,0,8,10,11,6 };
    	printf("初始序列:\n");
    	for (int i = 0; i < num; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	ShellSort(arr, num);
    	printf("\n排序后序列\n");
    	for (int i = 0; i < num; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    }
    
      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

    运行结果:
    在这里插入图片描述

    注:插入排序是排序的开始,各位努力学习的IT人员们,一起加油努力哦。祝各位学业有成,财源滚滚。
    ---------来自菜鸟TQ02的祝福语

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载