查找第i个元素

来源:互联网 发布:交换机 mac 编辑:程序博客网 时间:2024/05/16 08:42
 

利用快速排序随机算法实现查找第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;      }  }