插入排序

插入排序:插入排序是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表;

其主要思路是,将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直达整个序列有序;

时间复杂度大概是O(N2);

举个例子就是:

1,2,43,55,40,78,90,8.456

假设按照降序:

插入排序从第二个开始

第一次序列结果是:

2,1,43,55,40,78,90,8,456

第二次是:

43,2,1,55,40,78,90,8,456

第三次是:

55,43,2,1,40,78,90,8,456

详细解析第四次:

第四次指针指向40, 40 与前面排好序的有序列:55,43,2,1,中的最后一个1比较,发现比1大,将40 赋值给哨兵flag,那么将1往后移动,此时序列式55,43,2,1,1 ,40已复制到flag中,然后,将flag 与第四个从左往后比较,如果比flag小,则往后移动,第一次移动情况:

55,43,2,2,1 flag 依旧是40,再和第三个比,发现还是大了,于是记录继续后移:

55,43,43,2,1 flag 依旧是40,在和第二个比,发现合适了,于是,插入到这里:

55,43,40,2,1,

 

整个过程大概是这样的;

下面给出一个实例:

 

#include<iostream>
using namespace std;

#define N 10


void Insert_D2(int *a );
void Insert_D3(int *a );

void SoupSeq(int *b);

int Arr[N]= {49,38,1,76,13,27,56,77,11,15};
int main()
{
	
	
	//SoupSeq(Arr) ;
	//Insert_D2(Arr);
	//Insert_D3(Arr);
	return 0;
}

//直接插入排序;升序
void Insert_D2(int *a)
{
	int temp;//哨兵
	for(int i = 1;i<N;i++)
	{
		if(a[i]<a[i-1])//如果待插入的比结尾的小
		{
			temp = a[i];//将此值付给哨兵;
			a[i] = a[i-1];//序列扩大一个
			int j;
			for(j = i-1;(a[j]>temp) && j>=0;--j)  //如果往左边的一个大于哨兵
			a[j+1] = a[j]; //记录后移
			a[j+1] = temp;
		}

	}

}
//直接插入排序;降序
void Insert_D3(int *b)
{
	int temp =0;
	for(int i = 1;i<N;i++)
	{
		if(b[i]>b[i-1])
		{
			temp = b[i];
			b[i] = b[i-1];
			int j = 0;
			for(j= i-1;j>=0 && b[j]<temp;--j)
				b[j+1] = b[j];
			b[j+1] = temp;
		}
	}
}

//最简单的排序
void SoupSeq(int *b)
{
	int temp;
	for(int i = 0;i<N;i++)
	{
		for(int j = i+1;j<N;j++)
		{
			if(b[i]>b[j])
			{
				temp = b[i];
				b[i] =  b[j];
				b[j] = temp;
				//下面是不使用临时变量做交换
/*b[i] = b[i]+b[j];
				b[j] = b[i]-b[j];
				b[i] =b[i] -b[j];*/

			//也可使用未操作来达到交换变量
//b[i] = b[i]^b[j];
				//b[j] = b[j]^b[i];
				//b[i] = b[i]^b[j];
			}
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值