顺序统计学(算法导论第九章)
2013-05-20 21:25
323 查看
找第i小的数
/** * @brief Order Statistics * @author An * @data 2013.5.20 **/ #include <stdlib.h> #include <time.h> using namespace std; int Partition( int *array, int low, int high ) { int i = low - 1; int pivot = array[ high ]; for ( int j = low; j < high; ++j ) { if ( array[ j ] <= pivot ) { ++i; int tmp = array[ i ]; array[ i ] = array[ j ]; array[ j ] = tmp; } } ++i; array[ high ] = array[ i ]; array[ i ] = pivot; return i; } int Random( int a, int b ) { srand( (int)time(0) ); return rand() % ( b - a + 1 ) + a; } int RandPartition( int *array, int low, int high ) { int index = Random( low, high ); int tmp = array[ index ]; array[ index ] = array[ high ]; array[ high ] = tmp; return Partition( array, low, high ); } // int RandSelect( int *array, int low, int high, int order ) // { // if ( low == high ) // { // return array[ low ]; // } // int k = RandPartition( array, low, high ); // if ( order == k + 1 ) // { // return array[ k ]; // } // if ( order < k + 1 ) // { // return RandSelect( array, low, k - 1, order ); // } // else // { // return RandSelect( array, k + 1, high, order ); // } // } int RandSelect( int *array, int low, int high, int order ) { if ( low == high ) { return array[ low ]; } int q = RandPartition( array, low, high ); int k = q - low + 1; if ( order == k ) { return array[ q ]; } if ( order < k ) { return RandSelect( array, low, q - 1, order ); } else { return RandSelect( array, q + 1, high, order - k ); } }
相关文章推荐
- 算法导论学习笔记-第九章-中位数和顺序统计学
- 第九章中位数和顺序统计学之“查找第i小的元素(递归版)平均运行时间为O(n)算法”
- 第九章中位数和顺序统计学之“查找第i小的元素(迭代版)平均运行时间为O(n)算法”(练习9.2-3)
- 排序和顺序统计学(算法导论)
- 【算法导论 第9章 中位数和顺序统计学】
- 算法导论 学习笔记 第九章 中值和顺序统计
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 算法导论第9章中位数和顺序统计学
- 算法导论——第六章——中位数和顺序统计学
- 【算法导论 第9章 中位数和顺序统计学】
- 算法导论 第9章 排序和顺序统计学算法导论
- 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章
- 算法导论--动态顺序统计与区间树
- [算法导论]第九章《中位数和顺序统计量》
- 第九章中位数和顺序统计学之“寻找第2小元素”(练习9.1-1待改进)
- 算法导论第九章:中位数和顺序统计学
- 算法导论: 第九章
- 【算法导论-34】红黑树、顺序统计树的Java实现
- 第九章中位数与顺序统计学之“同时找出最小值和最大值”
- 算法导论第九章中位数和顺序统计学例题