算法导论 改进快排(2)----针对相同元素值 7.2

来源:互联网 发布:淘宝的hottoys有假货吗 编辑:程序博客网 时间:2024/05/20 21:18

问题:序列中有较多相同元素值时,随机化快排的性能下降

思路:PARTION将序列分为三个部分A(p,q,t,r),A[p,...,q-1]中元素都小于A[q],A[q,...,t]中元素都相等,A[t+1,...,r]中元素都大于A[q]。QUICKSORT只对分区内互不相同的元素才做递             归。

代码:

#include<iostream>#include<stdlib.h>#include<time.h>using namespace std;void Swap(int &a, int &b)//交换两个数的函数{int temp=b;b=a;a=temp;}int* New_Partition(int *A, int p, int r)  //新的分区函数    {          int *index=new int[2];int k=rand()%(r-p+1)+p;//随机化快排Swap(A[k],A[r]);int i=p-1;for(int j=p;j<r;j++) //把比主元小的元素都排到前面{if (A[j]<A[r]){++i;Swap(A[i],A[j]);}}index[0]=i+1;//记录相等元素开始的下标for(int l=i+1;l<r;l++)//再把和主元相等的元素排到中间{if (A[l]==A[r]){++i;Swap(A[l],A[i]);}}index[1]=i+1;//记录相等元素结束的下标Swap(A[i+1],A[r]);return index;}      void QuickSort(int  *A, int p, int r)      {          if(p < r)          {              int *new_index= New_Partition(A, p, r);         QuickSort(A, p, new_index[0]-1);         QuickSort(A, new_index[1]+1, r);delete [] new_index;    }      } int main(){int A[9]={2,1,3,5,8,4,1,4,4};for(int m=0;m<=8;m++)cout<<A[m]<<" ";cout<<endl;srand((unsigned)time(NULL));QuickSort(A,0,8);for(int n=0;n<=8;n++)cout<<A[n]<<" ";cout<<endl;return 0;} 




0 0
原创粉丝点击