#include <iostream>
#include <time.h>
using namespace std;
void out(int a[],int n){
for(int i = 0;i<n;i++){
cout<<a[i]<<" ";
if(i % 8 == 0 && i != 0)
cout<<endl;
}
cout<<endl;
}
void Buddlesort(int p[],int start,int end)//冒泡排序
{
if(start<end)
{
int temp=0;
int length=end-start+1;
for(int i=0;i<length-1;i++)
{
if(p[i]>p[i+1])
{
temp=p[i];
p[i]=p[i+1];
p[i+1]=temp;
}
}
end--;
Buddlesort(p,start,end);
}
}
int selectDo(int A[], int low, int high, int k){
//select k min number
int p = high - low + 1;
if(p < 44){
Buddlesort(A, low, high+1);
return A[low+k];
}
//A divided into q groups, each group 5 elements, and sort them
int q = p/5;
int *M = new int[q];
for(int i = 0; i < q; i ++){
Buddlesort(A, low + 5*i, low + 5*i + 5);
M[i] = A[low+5*i+2];
}
//select mid in M
int mid = selectDo(A, 0, q-1, (q-1)/2);
//A divided into 3 groups
int *A1 = new int[p];
int *A2 = new int[p];
int *A3 = new int[p];
int count1, count2, count3;
count1 = count2 = count3 = 0;
for(int i = low; i <= high; i ++){
if(A[i] < mid)
A1[count1++] = A[i];
else if(A[i] == mid)
A2[count2++] = A[i];
else
A3[count3++] = A[i];
}
if(count1 >= k)
return selectDo(A1, 0, count1-1, k);
if(count1 + count2 >= k)
return mid;
return selectDo(A3, 0, count3-1, k-count1-count2);
}
int select(int A[], int n,int k)
{
return selectDo(A, 0, n-1, k);
}
int main()
{
int n,*p,k;
cout<<"Please input the length of your Array:";
cin >> n;
p = new int[n];
srand((unsigned)time(NULL)); //生成随机数
for(int i=0;i<n;i++)//为动态数组赋值
{
p[i]=rand();
}
out(p,n);
cout<<endl;
cout<<"请输入想查找第k小的k值: ";
cin>>k;
if(k<=n)
cout<<select(p,n,k);
cout<<endl;
out(p,n);//为动态数组打印
Buddlesort(p,0,n-1);//Maopao
out(p,n);//为动态数组打印
return 0;
}