【算法导论】线性时间选择---从数组中选择第i小的数
来源:互联网 发布:卡雷尔机器人编程 编辑:程序博客网 时间:2024/05/21 09:04
问题:从数组中选择第i小的数,并且要求问题的时间复杂度为O(n)。
代码用到了随机化的快速排序中的分组方法。
其基本原理为:用快速排序的分组方法,随机的选择一个数组元素,使其大于左边的元素,小于右边的元素。然后,看这个元素的下表与要求元素中第i小的值是否相等,如果小于i则表示要查找的元素在当前分组元素的右边,如果大于i表示在左边。这样递归进行,可以达到很高的运行效率。
c++实现的代码如下:
#include <iostream> #include <ctime>#include <set> #include <string> void swap(int * a,int * b); int partition(int * array_list,int left,int right); void Print(); int random_partition(int * array_list,int left,int right); const int size = 8; int random_slelect(int * array_list,int left,int right,int index);int * array_list; int main() { array_list = new int [sizeof(int)*size]; srand((unsigned)time(NULL));for(int i=0;i<size;i++) {/*随机的填充数组元素*/ int ran_num=rand()%( size*10); array_list[i] = ran_num; } Print(); std::cout<<random_slelect(array_list,0,size-1,1);getchar();return 0; } /*从数组中,选择第i小的数*/int random_slelect(int * array_list,int left,int right,int index){int val = 0;if(left == right){val = array_list[left];return val;}int q = random_partition(array_list,left,right);int k = q - left + 1;if(index == k){return array_list[q];}else if( index < k){random_slelect(array_list,left,q-1,index);}else{random_slelect(array_list,q+1,right,index - k);}}/*随机化的快速排序分组方法,对于输入的元素加入随机化的成分,使之获得较好的平均性能*/ int random_partition(int * array_list,int left,int right) { srand(left); int ran_num=( rand())% right; if((ran_num < left )) {/*防止出现因为取模后随机数为0的情况*/ ran_num = left; } /*如果,不交换排序区间内的数据,则成为普通的快速排序*/ swap(&array_list[right],&array_list[ran_num]); return partition(array_list,left,right); } int partition(int * array_list,int left,int right) { int index = left; int pivot = array_list[right]; for(int i= left ; i< right; i++) { if(array_list[i] < pivot) { swap(&array_list[index],&array_list[i]); index ++; } } swap(&array_list[right],&array_list[index]); //Print(); return index; } void swap(int * a,int * b) { int tmp = *a; *a = *b; *b = tmp; } void Print() { for(int i=0;i< size;i++) { std::cout<<array_list[i]<<"\t"; } std::cout<<std::endl; }
- 【算法导论】线性时间选择---从数组中选择第i小的数
- 算法导论-选择数组中第K小的数(选择问题)
- 在数组中选择第i小的数
- 《算法导论》CLRS算法C++实现(九)P109 选择数组中第i小(大)的数 顺序统计量
- 算法导论CLRS 9.2 选择第i小的元素
- 【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)
- 寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法
- 算法导论 第2版 9.2 线性时间做选择
- 算法导论第9章最坏情况为线性时间的选择算法
- 算法导论,9.3,最坏情线性时间的选择算法
- 基于快排的选择算法:返回数组中第k小的数
- 从数组中选择第k大的数
- 以期望线性时间选择第i小的元素(9.2)
- 算法导论--在无序数组中选择第k小个数
- 算法--选择第K小的数
- 算法导论--选择第k小的数字,期望时间为n
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 查找数组第i小的数-《算法导论》学习笔记十
- ASP.NET 页生命周期概述
- JAVA笔试题
- POJ-1251-Jungle Roads
- 生成/创建 DLL 及调用/引用DLL里的函数、全局变量、静态C++类成员函数等
- Android控件之TabHost
- 【算法导论】线性时间选择---从数组中选择第i小的数
- Ubuntu 12.04安装QQ for Linux
- 黑马程序员__计算N的阶乘的0的个数
- 10048Audiophobia--好题
- 判断单链表是否存在环
- Start
- Java RMI 远程方法调用 (Remote Method Invocation)
- 百度云调试 上传apk到百度安卓虚拟机调试
- 排序算法复杂度