排序算法一:插入排序

插入排序:

1.整个排序包括两层循环。用迭代器i循环通过容器,在每次循环迭代中,使用另一个循环根据小于i的位置上的项将*i插入到其对应的位置。


#include <iostream>
#include <algorithm>
#include <time.h>
#include <string>
using namespace std;
void linear_insert(int *first,int *last,int value)
{
	if(value<*first)//如果待插入的值小于已经排好序的第一个数值,就直接将value之前的值后移一个位置,将value插在第一个位置
	{
		copy_backward(first,last,last+1);
		*first=value;
	}
	else//如果待插入的value值不比第一个值小,就依次从value所在的位置开始逆向向前查找,直到找到第一个不比value大的位置(*ii<=value),将value插到这个位置之后
	{
		int *next=last;
		next--;
		while(*next>value)
		{
			*last=*next;
			last=next;
			--next;
		}
		*last=value;
	}
}
void insert_sort(int *first,int *last)
{
	if(first==last)
		return;
	for(int *i=first+1;i!=last;i++)//第一层循环,从first+1开始,每次将一个值插入到first,并判断插入的准确位置
	{
		linear_insert(first,i,*i);
	}
}
int main()
{
	const string ORIGINAL_ARRAR="The original array is:";
	const string STL_SORT="The STL_sort array is:";
	const string INSERT_SORT="The INSERT_SORT array is:";
	const string STL_SORT_TIME="The time used for STL_SORT:";
	const string INSERT_SORT_TIME="The time used for INSERT_SORT:";
	int numArrar1[10]={59,46,32,80,46,55,87,43,70,81};
	int numArrar2[10]={59,46,32,80,46,55,87,43,70,81};
	cout<<ORIGINAL_ARRAR<<endl;
	for(int i=0;i<(sizeof(numArrar1)/sizeof(int));i++)
		cout<<numArrar1[i]<<" ";
	cout<<endl;
	long time_start1,time_start2,time_end1,time_end2,time1,time2;
	time_start1=time(NULL);
	insert_sort(numArrar1,numArrar1+10);
	time_end1=time(NULL);
	time_start2=time(NULL);
	sort(numArrar2,numArrar2+10);
	time_end2=time(NULL);
	time1=time_end1-time_start1;
	time2=time_end2-time_start2;
	cout<<INSERT_SORT<<endl;
	for(int i=0;i<(sizeof(numArrar1)/sizeof(int));i++)
		cout<<numArrar1[i]<<" ";
	cout<<endl;

	cout<<STL_SORT<<endl;
	for(int i=0;i<(sizeof(numArrar2)/sizeof(int));i++)
		cout<<numArrar2[i]<<" ";
	cout<<endl;

	cout<<INSERT_SORT_TIME<<endl;
	cout<<time1<<endl;

	cout<<STL_SORT_TIME<<endl;
	cout<<time2<<endl;
	return 0;
}

插入排序是稳定排序,即保持了相等项的相对顺序。

因为当value=*next时,那么while循环停止,然后value被插入到next+1的位置。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值