插入排序和求逆序数

来源:互联网 发布:linux tomcat无法启动 编辑:程序博客网 时间:2024/06/05 03:59
//插入排序的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
0 0
原创粉丝点击