//下面两种part效率比较:相同运算量下part比part2快5倍左右,part2写法简单但是效率低

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std; int part(int *arr, int l , int r)
{
c_num += r - l;
swap(arr[r],arr[l+rand()%(r-l)]);
int q = r--;
while( l < r)
{
while(l <= r && arr[l] <= arr[q]) ++l;
while(l < r && arr[r] >= arr[q]) --r;
if(l<r&&arr[l]>arr[r]) swap(arr[l], arr[r]);
}
if(l<q&&arr[l]>arr[q]) swap(arr[l], arr[q]);
return l;
} int part2(int *arr, int l , int r)
{
c_num += r - l;
int k, q = l;
swap(arr[l], arr[l+rand()%(r-l)]);
for(k = l+; k <= r; ++k)
{
if(arr[k] <= arr[q])
{
if(++l != k)
swap(arr[l], arr[k]);
}
}
swap(arr[l], arr[q]);
return l;
} void qsort(int *arr, int l, int r)
{
if(l >= r) return;
int mid = part(arr, l , r);
qsort(arr, l, mid-);
qsort(arr,mid+, r);
} int findNumK(int *arr, int l, int r, const int k)
{
if(l >= r)
{
return arr[k];
}
int mid = part(arr, l , r);
if(k < mid)
{
return findNumK(arr, l, mid-, k);
}
else if (k > mid)
{
return findNumK(arr,mid+, r, k);
}
else
{
return arr[k];
}
}
#define MAX_RAND 82934829
int myRand(int n)
{
return (long((double)rand()/RAND_MAX * MAX_RAND))%n;
}
const int n = ;
int ki = ;
int arr[n];
int brr[n];
int _tmain(int argc, _TCHAR* argv[])
{
for(int i = ; i < n; ++i)
{
arr[i] = i;
}
for(int i = ; i < n; ++i)
{
swap(arr[i],arr[myRand(n)]);
}
for(int i = ; i < n; ++i)
{
brr[i] = arr[i];
}
printf("@@@@@@@\n");
while(cin>>ki)
{
printf("\n%d %d\n", c_num, findNumK(brr, , n-, n-ki));
for(int i = ; i < n; ++i)
{
brr[i] = arr[i];
}
c_num = ;
}
printf("\n################\n");
c_num = ;
qsort(arr, , n-);
for(int i = n-; i >= n - ki; --i)
{
printf("%d ", arr[i]);
}
printf("\n%d\n",c_num);
getchar();
return ;
}

求第k大的数(用到快速排序算法的思想)的更多相关文章

  1. 《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数

    求一组N个数中的第k个最大者,设k=N/2. import java.util.Random; public class K_Max { /** * @param args */ //求第K大的数,保 ...

  2. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  3. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

  4. 寻找数列中第k大的数算法分析

    问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...

  5. [LeetCode] 4. Median of Two Sorted Arrays(想法题/求第k小的数)

    传送门 Description There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the m ...

  6. 求第k小的数

    题目链接:第k个数 题意:求n个数中第k小的数 题解: //由快速排序算法演变而来的快速选择算法 #include<iostream> using namespace std; const ...

  7. 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

    题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...

  8. 求数列中第K大的数

    原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...

  9. 无序数组求第k大/第k小的数

    根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...

随机推荐

  1. 题解 P3372 【【模板】线段树 1】(珂朵莉树解法)

    这道题可以用珂朵莉树做,但是由于数据比较不随机,而我也没有手写一颗平衡树,所以就被卡掉了,只拿了70分. 珂朵莉树是一种基于平衡树的(伪)高效数据结构. 它的核心操作是推平一段区间. 简而言之,就是把 ...

  2. 【转】 HtmlAgilityPack使用——XPath注意事项

    [转] HtmlAgilityPack使用——XPath注意事项 在使用HtmlAgilityPack这个开源的类库进行网页内容解析的时候是非常的方便(使用方法见另一篇博客<HTML解析:基于X ...

  3. android selector设置button点击效果(具体)以及常见问题

    button的点击效果学习起来其实比較easy,此点对开发人员来说也是使用的比較频繁的一个知识点,与它相关的还有编辑框的获取焦点时改变背景颜色.选择button选择时改变字体颜色等等.这些其实都是用到 ...

  4. 异步FIFO及verilog原码

    这几天看了Clifford E. Cummings的两篇大作<Simulation and Synthesis Techniques for Asynchronous FIFO Design&g ...

  5. hashCode 和 equals 方法

    hashCode 和 equals 方法 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. 使用hashCode()和 ...

  6. Python(一) 基本类型

    前言: 什么是代码? 代码是现实世界事物在计算机世界中的映射. 什么事写代码? 写代码是将现实世界中的事物用计算机语言来描述. 一.数字:整形与浮点型 整型:int 浮点型:float (没有单精度和 ...

  7. linux RAC 安装失败完全卸载

    1,删除软件安装目录 rm -rf /u01/app 2,删除以下目录内容 rm -rf /tmp/.oracle rm -rf   /tmp/* rm -rf   /tmp/ora* rm -rf ...

  8. react-native使用androidstudio时,安卓模拟器reload菜单界面显示快捷键ctrl+M;

    react-native使用androidstudio时,安卓模拟器reload菜单界面显示快捷键ctrl+M:

  9. Swift学习笔记(6)--字典

    1.定义 //1.基本定义 [key 1: value 1, key 2: value 2, key 3: value 3] var dict = ["name":"Xi ...

  10. 如何形象的解释 webhook 这个词

    就是一个 callback,只不过 callback 的操作是发送指定的 HTTP request 给一个指定的地址. callback 就是由甲传给乙,乙处理完之后通知甲传过来的方法或者请求甲方的 ...