快速选择
来源:互联网 发布:linux系统模拟下载 编辑:程序博客网 时间:2024/05/17 22:00
《数据结构与算法分析——c语言描述》 第七章
算法真的很重要,选择问题是这本书一个循序渐进的例子。这次把复杂度强行降到O(N)。
#include<stdlib.h> #include<stdio.h> int RandInt(int i, int j) {int temp;temp = (int)(i + (1.0*rand() / RAND_MAX)*(j - i));return temp;}void getRandomInt(int *A, int n) {for (int i = 0; i < n; i++) {A[i] = i + 1;}for (int i = 1; i < n; i++) {//std::swap(A[i], A[RandInt(0, i)]); int randAdrr = RandInt(0, i);int t = A[i];A[i] = A[randAdrr];A[randAdrr] = t;}}int a[99999999];typedef int ElementType;void insertionSort(int *a, int n) {int j, p;int temp;for (p = 1; p < n; p++) {temp = a[p];for (j = p; j > 0 && temp < a[j - 1]; j--)a[j] = a[j - 1];a[j] = temp;}}void swap_my(ElementType *a, ElementType *b) {ElementType temp;temp = *a;*a = *b;*b = temp;}ElementType median3(ElementType a[], int left, int right) {int center = (left + right) / 2;if (a[left] > a[center])swap_my(&a[left], &a[center]);if (a[left] > a[right])swap_my(&a[left], &a[right]);if (a[center] > a[right])swap_my(&a[center], &a[right]);swap_my(&a[center], &a[right - 1]);return a[right - 1];}#define CUTOFF (3)void qSelect(ElementType a[], int k, int left, int right) {if (left + CUTOFF <= right) {int i, j;ElementType pivot;pivot = median3(a, left, right);i = left;j = right - 1;while (1) {while (a[++i] < pivot) {}while (a[--j] > pivot) {}if (i < j)swap_my(&a[i], &a[j]);elsebreak;}swap_my(&a[i], &a[right - 1]);//把枢纽元换回来if (k < i+1)//k从1开始,i从0开始,小于枢纽元qSelect(a, k, left, i - 1);else if (k > i+1)qSelect(a, k, i + 1, right);}else {insertionSort(a + left, right - left + 1);//第k大的位于left和right之间,拍一下序}}#define N 99999999int main() {getRandomInt(a, N);int k;scanf("%d", &k);qSelect(a,k,0, N-1);printf("%d", a[k-1]);}
0 0
- 快速选择
- 快速选择
- 快速选择
- 快速选择
- 快速选择
- 快速选择
- 快速选择
- vscode列选择 快速选择
- 快速排序->快速选择算法
- 快速排序和快速选择
- 快速排序及快速选择
- 快速排序和快速选择
- 快速,冒泡,选择排序
- 快速选择算法
- 快速选择下拉列表
- 快速排序,选择排序
- 选择排序/快速排序
- TopK-快速选择算法
- bzoj4539【HNOI2016】树
- 160613xib与代码混写界面注意事项
- 递推 2016.6.19
- **C++**C++刷题笔记
- As新建一个module形式的第三方library
- 快速选择
- 深入理解javascript的作用域--函数声明为什么会前置
- jdk的配置
- Ubuntu下让Linux开发板通过笔记本上网
- UVA - 725(水题)
- 数据结构之二叉树
- 动态SQL与模糊查询
- 使用Hive编写MapReduce程序
- Ubuntu 安装JDK1.8