快速排序-随机选择,寻找最小的第K个数

来源:互联网 发布:最好的中文编程语言 编辑:程序博客网 时间:2024/05/02 20:18
#include "stdafx.h"
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;

int myrand(int p,int r)
{
int size= r-p;
return p+rand()%size;
}
void swap(int &a,int &b)
{
int temp=b;
b=a;
a=temp;
}

int partition(int arr[],int p, int r)
{
int x=arr[r];
int i=p-1;
for(int j=p;j<=r-1;j++)
{
if(arr[j]<=x)
{
i=i+1;
swap(arr[i],arr[j]);
}
}
swap(arr[i+1],arr[r]);
return i+1;
}

int randomizedpartition(int arr[],int p, int r)
{
int index=myrand(p,r);
swap(arr[index],arr[r]);
return partition(arr,p,r);
}

   int randomizedselect(int arr[],int p ,int r, int k)
{
if(p==r) return arr[p];
int q=randomizedpartition(arr,p,r);
int m=q-p+1;
if(k==m) return arr[q];
else if(k<m)
return randomizedselect(arr,p,q-1,k);
else if(k>m)
return randomizedselect(arr,q+1,r,k-m);
}
int main()
{
int array[10]={33,22,10,45,67,8,6,23,4,78};
cout<<randomizedselect(array,0,9,6)<<endl;
return 0;
}
0 0
原创粉丝点击