插入排序:
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的位置。