一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

时间:2021-04-30 00:28:35

一、快速排序(快速分类)算法:

问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。

思想:选取数组A中的某个元素 t=A[s],然后将其他元素重新排列,使A中所有在t以前出现的元素都小于或等于t,而在t之后出现的元素都大于或等于t。这个重新整理的过程称为划分,t称为划分元素。

方法:分治法

算法(SPARKS):

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

 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;
     ;
 }

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

算法分析:

最坏时间复杂度:O(n2)

平均时间复杂度:O(nlogn)

空间复杂度:O(n)[可通过有递归转变为迭代,达到O(logn)]

稳定度:不稳定

二、选择问题

问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。

思想:借助快速排序中的一次分划操作实现。

方法:二次取中法(分治法)

算法(SPARKS):

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

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;
 }

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

算法分析:

在最坏情况下,算法Select需要O(n2)计算时间
但可以证明,算法Select可以在O(n)平均时间内找出n个输入元素中的第k小元素。