期望时间为线性时间的选择算法(C++)
2015-09-01 19:31
330 查看
#include <iostream> using namespace std; void exchange(int& x, int& y){ int tem = x; x = y; y = tem; } int par(int a[],int b,int e){ int x = a[b]; int j = b + 1; int i = b; for(;j != e + 1;++j){ if(a[j] <= x){ ++i; exchange(a[i],a[j]); } } exchange(a[b],a[i]); return i; } int select(int a[],int p,int r,int i){// To select the i.th little digit if(p == r) return a[r]; int q = par(a,p,r);//q是划分后首元素在序列中的下标 int k = q - p + 1;//k是已经确定此序列a[p...r]的第k小元素 if(i == k) return a[q]; else if(i < k) return select(a,p,q - 1,i); else return select(a,q + 1,r,i - k);//第一次把q写成k了。。。 } int main(int argc, char *argv[]) { int a[] = {50,2,11,22,33,44,66,88,77,99}; cout << select(a,0,9,-1) << endl; return 0; }
相关文章推荐
- C语言基础知识之(十九):内存操作的其他函数:内存初始化,内存拷贝,内存比较
- C语言基础知识之(十八):堆内存的分配函数及运用
- C语言基础知识之(十七):内存的分区:栈区,堆区,静态区(全局区),常量区,代码区
- Visual C++文件扩展名解读
- 【C++学习心得】第一部分:基本语言
- C++连接Mysql数据库
- C++标准库vector类型
- 论char数组在c++和java中的不同
- c语言中的“/”和“%”
- c++中的隐藏、重载、覆盖(重写)
- 打印一个集合的幂集C++实现
- C++版的坦克大战(1)---实现基本设计和j简单思想
- C++包括头文件<>和""差额
- c语言编的心形图案,有兴趣的看看
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言day02-变量、数据类型、赋值、其他
- C/C++_文件重定向的几种方式
- c语言练习题 2-5 反弹
- Effective C++ 条款29 为"异常安全"而努力是值得的
- C++面向对象高级开发课程(第一周)