快速排序——中位数

#include <iostream>
using namespace std;
int quick_sort(int a[],int left,int right)
{
if(left>right)
    return 0;
int i,j,t,key;
key=a[left];
i=left;
j=right;
while(i!=j){
while(i<j&&a[j]>=key)
    j--;
while(i<j&&a[i]<=key)
    i++;
if(i<j){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=key;
return i;
/*quick_sort(a,left,i-1);
quick_sort(a,i+1,right);*/
}
double medium(int a[],int n){
    int left=1;
    int right=n;
    int mid=(left+right)/2;
    int num;
    while(1){
        num=quick_sort(a,left,right);
        if(num==mid)
        break;
        if(num<mid)
        left=num+1;
        if(num>mid)
        right=num-1;
    }
    return (n%2!==0)?a[mid]:(double)(a[mid]+a[mid+1])/2;
}

int main(){
int a[100],n;
cin>>n;
for(int i=1;i<=n;i++){
 cin>>a[i];
}
cout<<medium(a,n)<<endl;
}

时间: 2024-10-19 06:49:59

快速排序——中位数的相关文章

快速排序(取中位数法)

#include<iostream> #include<algorithm> #include<iterator> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle = left+(right-left)>&g

数据结构学习笔记06排序 (快速排序、表排序)

1.快速排序 不稳定 分而治之 找主元pivot,小于主元划分为一个子集,大于主元的划分为一个子集 然后进行递归 最好情况:每次主元正好中分,T(N) = O( NlogN ) 选主元 的方法有很多,这里用 取头.中.尾的中位数. 直接选A[0]为pivot,时间复杂度T ( N ) = O( N ) + T ( N–1 ) = O( N ) + O ( N–1 ) + T( N–2 ) = = O( N ) + O ( N–1 ) + …+ O( 1 ) = O( N^2 ) 随机取pivot

用快速排序法寻找第k大元素

#include<iostream> #include<algorithm> #include<iterator> #include<cstdio> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle =

海量数据查找中位数

现在 有10亿个int型的数字(JAVA中 int 型占4B),以及一台可用内存为1GB的机器,如何找出这10亿个数字的中位数? 中位数定义:数字排序之后,位于中间的那个数.比如将10亿个数字进行排序(位置从1到10亿),排序之后,位于第5亿个位置的那个数 就是中位数. 关于中位数,可参考:快速排序中的分割算法的解析与应用 一种方法是定义一个长度为10亿的整型数组,采用排序算法排序.但是: 10亿个数字,每个数字在内存中占4B,10亿个数字完全加载到内存中需要:10*108*4B ,约为:4GB

6.比较排序之快速排序

快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查. 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换.而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置.例如为了找到最佳基数,则需要在整个待排序列中找到中位数,但查找中位数实际上代价又会很高.基数的选择通常来说就是待排序序列中的第一个对象或者中间的一个对象或者最后一个对象.本文以选取第一个元素为例对快排做一个简要分析实现. 以待排序列{6, 5, 3, 1

算法导论 中位数和顺序统计量(python)

第i个顺序统计量:该集合中第i小的元素(建集合排序后第i位 当然算法可以不排序) 中位数:集合中的中点元素 下中位数 上中位数 9.1最大值和最小值 单独的max或min每个都要扫一遍 n-1次比较 如果同时找max和min 要 :1.2个数相互比较 1次{每次选出2个 选n//2次} 2.大的和max比较 3.小的和min比较 找出序列为第i小的数Θ(n) 随机快速排序的运用:(可以回去看快排) 代码: import random def PARTTION(A,p,r): x = A[r] i

算法导论第九章中位数和顺序统计量(选择问题)

本章如果要归结成一个问题的话,可以归结为选择问题,比如要从一堆数中选择最大的数,或最小的数,或第几小/大的数等, 这样的问题看似很简单,似乎没有什么可研究的必要,因为我们已经知道了排序算法,运用排序+索引的方式不就轻松搞定了?但细想,排序所带来的时间复杂度是不是让这个问题无形之中变得糟糕.那算法研究不就是要尽可能避免一个问题高复杂度地解决,让那些不敢肯定有无最优解的问题变得不再怀疑,这也是算法研究者所追求的一种极致哲学.既然排序让这个问题解决的性能无法确定,那我们就抛开排序,独立研究问题本身,看

算法导论第七章快速排序

一.快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法.现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1).快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择.原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序. (2).快速排序的思想和合并排序一样,即分治.快排排序的分治思想体现在: a.首先从待排序的数中选择一个作为基数,

9.中位数与顺序统计量

摘要: 本章所讨论的问题是在一个由n个不同数值构成的集合中选择第i个顺序统计量问题.主要讲的内容是如何在线性时间内O(n)时间内在集合S中选择第i小的元素,最基本的是选择集合的最大值和最小值.一般情况下选择的元素是随机的,最大值和最小值是特殊情况,书中重点介绍了如何采用分治算法来实现选择第i小的元素,并借助中位数进行优化处理,保证最坏保证运行时间是线性的O(n). 1.基本概念 顺序统计量:在一个由n个元素组成的集合中,第i个顺序统计量是值该集合中第i小的元素.例如最小值是第1个顺序统计量,最大