//插入排序的STL版本。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <iterator>
#include "1.h"
using namespace std;
int main(int argc,char** argv)
{
int a[]={5,1,9,4,6,2,0,3,8,7};
insertionSort<int*>(a,a+10); //模板参数为具体类型的指针
copy(a,a+9,ostream_iterator<int>(cout," "));
vector<int> va = vector<int>(a,a+3);
insertionSort<vector<int>::iterator>(va.begin(),va.end());
cout<< endl;
copy(va.begin(),va.end(),ostream_iterator<int>(cout," "));
cout<<endl;
return(0);
}
template<typename Iterator>
void insertionSort(const Iterator &a,const Iterator &b)
{
typedef typename iterator_traits<Iterator>::value_type T;
int i,j,n=distance(a,b);
T key;
Iterator p,q,t;
for(j=1,q=p=a,p++,t=p;j<n;j++,q=p,p++,t=p){
key=*p;
i=j-1;
while(i>=0 && *q>key){
*t=*q;
i--,t--,q--;
}
*t=key;
}
}
利用插入排序的思想,可以解决逆序数的问题。
例如,给定序列A<2,3,8,6,1>求其逆序个数
答案为5个:<2,1> <3,1> <8,1> <6,1> <8,6>
插入排序:假定A[1:j-1]为有序的,排序A[j]的过程为,不断的将A[j]与A[1:j-1]比较直到遇到小于A[j]的元素停止。
这之前的所有比较元素均大于A[j],根据逆序的定义可知,这个比较次数为逆序数
int main(int argc,char** argv)
{
int a[]={2,3,8,6,1};
int i,j,n=sizeof(a)/sizeof(int),key;
int count = 0; //逆序个数
for(i=1;i<n;i++)
{
key = a[i];
for(j=i-1;j>=0;j--)
{
if(key < a[j])
{
a[j+1] = a[j];
count++;
}
else
break;
}
a[j+1] = key;
}
cout << count;
return(0);
}
上述求逆序数的程序即为插入排序中加入一个变量count