一、快速排序(快速分类)算法:
问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。
思想:选取数组A中的某个元素 t=A[s],然后将其他元素重新排列,使A中所有在t以前出现的元素都小于或等于t,而在t之后出现的元素都大于或等于t。这个重新整理的过程称为划分,t称为划分元素。
方法:分治法
算法(SPARKS):
c++实现:
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; /* @快序排列算法的实现 */ int partition(int data[],int m,int p)///返回p,使得data[p]是第p小的值 { int i=m,j=data[i];///j是划分元素 bool flag=true; while(flag) { do i++; while(data[i]<j); do p--; while(data[p]>j); if(i<p) { int temp; temp=data[i]; data[i]=data[p]; data[p]=temp; } else flag=false; } data[m]=data[p]; data[p]=j; return p; } void quicksort(int data[],int low,int high) { if(low<high) { ; temp=partition(data,low,temp); quicksort(data,low,temp-); quicksort(data,temp+,high); } } int main() { /* @产生一个规模为CNT的,范围为[RANDMIN,RANDMAX)的随机数组,并显示 */ int cnt,randmin,randmax; cout<<"Please Input 'CNT' 'RANDMIN' 'RANDMAX'"<<endl; cin>>cnt>>randmin>>randmax; const int CNT=cnt, RANDMIN=randmin, RANDMAX=randmax; int Data[CNT]; srand((unsigned)time(NULL)); ; i<CNT; i++) Data[i]=RANDMIN+rand()%(RANDMAX-RANDMIN); cout<<"Before Change,Data="<<endl; ; i<CNT; i++) cout<<Data[i]<<" "; cout<<endl; /* @将数组用快速排序算法排序,并显示 */ quicksort(Data,,CNT-); cout<<"After Change,Data="<<endl; ; i<CNT; i++) cout<<Data[i]<<" "; cout<<endl; ; }
算法分析:
最坏时间复杂度:O(n2)
平均时间复杂度:O(nlogn)
空间复杂度:O(n)[可通过有递归转变为迭代,达到O(logn)]
稳定度:不稳定
二、选择问题
问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。
思想:借助快速排序中的一次分划操作实现。
方法:二次取中法(分治法)
算法(SPARKS):
c++实现:
#include<iostream> #define BIG 1024; using namespace std; ; ] {,,,,,,,,,,}; int partition(int m,int p)///返回p,使得data[p]是第p小的值 { int i=m,j=A[i];///j是划分元素 bool flag=true; while(flag) { do i++; while(A[i]<j); do p--; while(A[p]>j); if(i<p) { int temp; temp=A[i]; A[i]=A[p]; A[p]=temp; } else flag=false; } A[m]=A[p]; A[p]=j; return p; } int select(int k) { int m,r,j; m=; r=n; A[n]=BIG; bool flag=true; while(flag) { j=r; j=partition(m,j); if(k==j) flag=false; else if(k<j) r=j; else m=j+; } return A[j]; } int main() { cout<<"Before Change,A="<<endl; ; i<n; i++) cout<<A[i]<<" "; cout<<endl; cout<<"Please Input Your Choice(1-10)"<<endl; int s; cin>>s; cout<<"Your Choice: "; cout<<)<<endl; cout<<"After Change,A="<<endl; ; i<n; i++) cout<<A[i]<<" "; cout<<endl; }
算法分析:
在最坏情况下,算法Select需要O(n2)计算时间
但可以证明,算法Select可以在O(n)平均时间内找出n个输入元素中的第k小元素。