计数排序、选择排序、冒泡排序、插入排序的实现以及它们的比较次数和移动次数

来源:互联网 发布:网页源码怎么修改 编辑:程序博客网 时间:2024/06/05 00:39
//名次计算template<class T>void rank1(T a[],int n,int r[]){for(int i=0;i<n;i++){r[i]=0;}for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(a[j]<=a[i])r[i]++;elser[j]++;}}}//计数排序 元素比较次数为(n-1)n/2,移动次数为2ntemplate<class T>void resrrangge(T a[],n,int r[]){T *u=new T[n];for(int i=0;i<n;i++){u[r[i]]-a[i];}for(int i=0;i<n;i++){a[i]=u[i];}delete [] u;}//寻找最大元素位置template<class T>int indexOfMax(T a[],int n){int indexOfMax=0;for(int i=1;i<n;i++){if(a[indexOfMax]<a[i])indexOfMax=i;}return indexOfMax;}//选择排序 元素比较次数为(n-1)n/2,移动次数为3(n-1)template<class T>void selectionSort(T a[],int n){for(int size=n;size>1;size--){int j=indexOfMax(a,size);swap(a[j],a[size-1]);}}//一次冒泡过程template<class T>void bubble(T a[],n){for(int i=0;i<n-1;i++){if(a[i]>a[i+1[)swap(a[i],a[i+1]);}}//冒泡排序 比较次数为(n-1)n/2template<class T>void bubbleSort(T a[],int n){for(int i=n;i>1;i--){bubble(a,i);}}//在有序数组中插入一个元素template<class T>void insert(T a[],int & n,const T& x){int i;for(int i=n-1;i>=0 && x<a[i];i--){a[i+1]=a[i];}a[i+1]=x;n++;}//原地重排数组元素template<class T>void rearrange(T a[],int n,int r[]){for(int i=0;i<n;i++){while(r[i]!=i){int t=r[i];swap(a[t],a[i]);swap(r[t],r[i]);}}}//优化后的选择排序template<class T>void selectionSort1(T a[],int n){bool sorted=false;for(int size=n;!sorted && size>1;size--){int indexOfMax=0;sorted=true;for(int i=1;i<size;i++){if(a[indexOfMax]<a[i])i=indexOfMax;elsesorted=false;}swap(a[indexOfMax],a[size-1]);}}//插入排序 比较次数为n-1~(n-1)n/2template<class T>void insertSort(T a[],int n){for(int i=0;i<n;i++){T t=a[i];int j;for(j=i-1;j>=0 && t<a[j];j--){a[j+1]=a[j];}a[j+1]=t;}}
//折半查找template<class T>int binarySearch(T a[],int n,const T &x){int left=0;int right=n-1;while(left<=right){int middle=(left+right)/2;if(a[middle]==x)return middle;else if(a[middle]<x)left=midddle+1;elseright=middle-1;}return -1;}