排序算法——直接插入排序

排序算法——直接插入排序

直接插入排序思想

将待排序序列看成两部分,左部分为已经有序的,右部分为无序的(第一次左部分只有一个数据)。循环从右部分拿一个数据插入到左部分中(从左部分的最后一个数据开始比较,如果比拿的数据大,则将其向后挪动一个位置,直到找到比他小的,或者左部分遍历完),并且使得插入后的结果依旧有序。直到有部分没有数据为止!在这里插入图片描述
即将数组分为左右两部分,一开始左部分只有一个元素,左右部分想接触的两个数进行比较,若左边小于右边则不进行操作,若右边小于左边则,两元素交换并且继续向前比较,直到找到比该元素小的数字或者该元素已经是左部分最左边的元素。

直接插入排序
时间复杂度: 等差数列 O(n^2)
数据序列已经有序,则能达到最好时间复杂度: O(n)
数据趋于有序(部分有序): 时间复杂度就可以趋于 O(n),–》 数据越有序,时间复杂度越低。
空间复杂度: O(1)
稳定性: 稳定的

直接插入排序的实现

void InsertSort(int* arr, int len)
{
	for (int i = 1; i < len ; i++)
	{
		int tmp = arr[i];
		int j = i - 1;
		while (arr[j] > tmp && j >= 0)
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = tmp;
	}
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
#include<cstdio>
#include<ctime>


void Show(int* arr, int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d   ", arr[i]);
	}
	printf("\n");
}

void Swap(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}

void IsSort(int* arr, int len)
{
	for (int i = 0; i < len - 1; ++i)
	{
		if (arr[i] > arr[i + 1])
		{
			printf("无序\n");
			return;
		}
	}

	printf("有序\n");
}


void InsertSort(int* arr, int len)
{
	for (int i = 1; i < len ; i++)
	{
		int tmp = arr[i];
		int j = i - 1;
		while (arr[j] > tmp && j >= 0)
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = tmp;
	}
}



int main()
{
	int arr[10];
	int i;
	srand((unsigned int)time(0));
	for (i = 0; i <= 9; i++)
	{
		arr[i] = rand() % 100;
	}
	Show(arr, 10);

	InsertSort(arr, 10);
	IsSort(arr, 10);
	Show(arr, 10);



	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值