利用快速排序随机算法实现查找第i个数据,
唯一不同的是不必每次都对其进行排序,只需要对一边进行排序
同时:一版和二版的算法导论,快排有一点点不同,就在于是从第一个数,还是从最后一个数
快排的算法复杂度为O(nlgn)但是这个随机选择的期望时间为O(n)
#include <stdio.h>
#include <stdlib.h>
int radomselect(int data[],int begin,int end,int num);
void exchange(int data[],int i,int j);
int radom_partition(int data[],int begin,int end);
int npartition(int data[],int begin,int end);
int main()
{
int nData[8] = {5,3,2,6,4,1,3,7}; //创建10个数据,测试
int m=radomselect(nData, 0,7,7); //调用插入排序
printf("%d/n",m);
for (int i = 0; i < 8; ++i)
{
printf("%d ", nData[i]);
}
printf("/n");
system("puase");
return 0;
}
int radomselect(int data[],int begin,int end,int i)
{
if(begin==end)
return data[begin];
int q=radom_partition(data,begin,end);
int k=q-begin;
if(i==k)
return data[q];
else if(i<k)
return radomselect(data,begin,q,i);
else
return radomselect(data,q+1,end,i-k-1);
}
void exchange(int data[],int i,int j)
{
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
int radom_partition(int data[],int begin,int end)
{
int i = begin + rand() % (end - begin);
exchange(data,i,end);
return npartition(data,begin,end);
}
int npartition(int data[],int begin,int end)
{
int x=data[begin];
int i=begin;
int j=end;
while(1)
{
while(data[i]<x)
{
i++;
}
while(data[j]>x)
{
j--;
}
if(i<j)
{
exchange(data,i,j);
i++;
j--;
}
else
return j;
}
}