算法学习日记2---基本排序2--插入排序

       其实对于日常人们进行排序的时候,我们的排序思想不像是计算机思维中的冒泡排序等复杂的排序,而是类似于插入排序和选择排序,也就是找出位置不对的数字,将其摆放到正确的位置。你可能会说哪里有体现出插入排序呢?请你回想一下斗地主发牌的时候你插牌的顺序,那便是插入排序的例子。下面来介绍我对于插入排序的认知。

插入排序

       插入排序最大的特点,就是它的算法受数据的排布影响很大,就导致当一个无序数组的有序化较强的时候,插入排序就是不二之选。

       接下来介绍冒泡排序的思想方法。随便给出一个乱序数组,我们将这个数组进行升序排序。

       我们可以看到,这个数组arr[0]和arr[1]的值是已经满足了升序要求的,而到arr[2]时,数组不满足升序要求,于是我们就把arr[2]插入到它该在的位置,也就是满足升序的位置,也就是1~5中间,那我们怎么进行这个过程呢?

       上面两幅图只体现出arr[1]和arr[2]的排序过程,也就是插入排序的基本过程,就是将该插入的元素key与前面的元素进行比较,直到前面的元素比key大时,停止比较,将后面的值后移,给插入的元素位置腾出内存空间,赋值后就插入成功了。我个人感觉就像是一排人按从高到矮排队,如果有一个人的位置站得不对,就需要前面的或者后面的人为他腾出位置。下面是插入排序的代码实现。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//实现插入排序
void displayarr(int* arr, int size)
{
	printf("the array is:");
	for (int i = 0; i < size; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
void insertsort(int* arr, int size)
{
	for (int i = 1; i < size; i++)
	{
		int key = arr[i];
		int j = 0;
		for ( j = i - 1; j >= 0 && arr[j] > key; j--)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = key;
	}
}
int main()
{
	int arr[] = { 23,43,5,24,454,34,65,345,345,6543,89 };
	int size = sizeof(arr) / sizeof(int);
	insertsort(arr, size);
	displayarr(arr, size);
	return 0;
}

       从代码不难看出,在最复杂的情况下,插入排序算法的时间复杂度为O(n²),对于升序来说,什么是最坏的情况呢,就是倒序的时候,插入排序进入最复杂的情况。

       为什么插入排序的第一层循坏要从1开始呢,因为对于一个数字来说,它本身肯定有序,对第一个数字进行排序本身就是没有意义的。我们把插入的元素用key代替,观察第二个循环的进入条件( j >= 0 && arr[j] > key),j>=0所控制的数组不会越界,稍微想想便知,j如果是负数那下标就没有意义了,arr[j]>key的作用就是判断这个位置是不是应该插入值,条件成立的话,进入循环的主体:arr[j+1]=arr[j],这个主体配合arr[j] > key可以实现找到key该插入的位置,将该位置以后的数值进行后移,注意一定是arr[j+1]=arr[j],如果调换过来会导致数据丢失。最后将key赋值给arr[j+1],完成插入!

       以上是我对于插入排序的理解,如有不正确的地方,希望指出。制作不易,感谢您看到这里!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值