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

经典排序算法–直接插入排序

直接插入排序

插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,

算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。

插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

加下来我们讲解一下最简单的插入排序:直接插入排序
在这里插入图片描述
我们从图中可以看到我将i代表有序数组的尾部,j代表无序数组的首部,如果j的值小于i的值,则用tmp来保存i的值;反之,则j++
在这里插入图片描述
在这里插入图片描述

大概就是这个过程,学习编程最重要的就是思维,希望大家指正
下面给出代码以供大家理解:

#include <stdio.h>
#include <assert.h>
#include <iostream>

using namespace std;


/*
	直接插入排序
		就是把数组分割成为两个数组
		一个为有序数组
		一个为无序数组


*/
//打印函数
void Print(int arr[],int len)
{
	int i=0;
	for(i;i<len;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
}
//直接插入排序
void InsertSort(int arr[],int len)
{
	int j=1;//无序列的首部
	int i=j-1;//有序列的尾部

	//开辟栈空间保存结点
	int tmp=0;

	//遍历待排序部分
	for(j=1;j<len;j++)
	{
		//将待排序的数值保存
		int tmp=arr[j];
		//遍历排序数组中值
		for(i=j-1;i>=0&&arr[i]>tmp;i--)
		{
			arr[i+1]=arr[i];
		}
		arr[i+1]=tmp;
	}
}

int main()
{
	int arr[]={3,1,7,5,2,4,9,6};
	int len=sizeof(arr)/sizeof(int);


	Print(arr,len);
	InsertSort(arr,len);
	Print(arr,len);



	return 0;
}

元素集合越接近有序,直接插入排序算法的时间效率越高
最优情况下:时间效率为O(n)
最差情况下:时间复杂度为O(n2)
平均时间复杂度为O(n2)
空间复杂度:O(1)
稳定性:稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值