利用快排找中位数【未完成】

原创 2016年06月02日 10:19:05

快速排序找中位数


int sort(int* R,int low,int high) ;   
int median1(int *R,int n);    
int median2(int* R,int low,int high);
    const int mmax = 10000001;  // 9999;
    int a[mmax] = {1, 2, 4, 6, 3, 7, 5, 9, 8, 11, 3};  //待排数组  
    int len;
    int ans;
int partition(int* R,int low ,int high)
{
    int t = R[low];
    while(low<high)
    {
        while((low<high)&&(R[high]>=t))
            high--;
        R[low] = R[high];
        while((low<high)&&(R[low]<=t))
            low++;
        R[high] = R[low];
    }
    R[low] = t;
    return low;
}


void quick_sort1(int *R,int n)          //该函数进行sort过程的调用
{         
    sort(R,0,n-1);
}
void quick_sort2(int *R,int n)          //该函数进行median1过程的调用
{            
    median1(R,n);
}
void quick_sort3(int *R,int n)          //该函数进行median2过程的调用
{         
    median2(R,0,n-1);
}
<pre name="code" class="cpp">int sort(int* R,int low,int high)
{
    if(low>=high)
        return 0;
    int pivotloc = 0;
    pivotloc = partition(R,low,high);
    sort(R,low,pivotloc-1);
    sort(R,pivotloc+1,high);
}

int median1(int *R,int n){int left = 0;int right = n-1;int mid = (left + right)/2;int num;while(1){ num = partition(R,left,right); if(num == mid) break; if(num<mid) //说明在右边 left = num + 1; if(num>mid) right = num - 1;}return (n & 0x01)?R[mid]:(R[mid]+R[mid+1])/2;} int median2(int* R,int low,int high){if(low>=high) return 0;int mid = len/2;int pivotloc = 0; pivotloc = partition(R,low,high); if(pivotloc == mid){ ans=R[pivotloc];
return ans;
}
 if(pivotloc<mid) //说明在右边 median2(R,pivotloc + 1,high); if(pivotloc>mid) median2(R,low,pivotloc - 1);//return (n & 0x01)?R[mid]:(R[mid]+R[mid+1])/2;} void su(){ int len = mmax; srand( (unsigned)time( NULL ) ); for(int i = 0; i < len; i++){ a[i] = rand() % 100000000; } } int main(){ len = mmax; su(); clock_t start_time=clock(); //quick_sort1(a,len); //时间复杂度大 //cout<<a[len/2]<<endl; //cout<<ans<<endl; clock_t end_time=clock(); cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间 start_time=clock(); quick_sort2(a,len); //可以 cout<<a[len/2]<<endl; //cout<<ans<<endl; end_time=clock(); cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间 start_time=clock(); //quick_sort3(a,len); //有时会输出0 //cout<<a[len/2]<<endl; //cout<<ans<<endl; end_time=clock(); cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间 system("pause"); }




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

LintCode#80FindMedian(利用快排找中位数)

查找中位数:用时间复杂度为o(nlogn)的算法,给定一个未排序的整数数组,找到其中位数。中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

查找最小的k个元素-快排、中位数选择(上)

查找最小的k个元素(数组) 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 //coder:LEE //20...

未完成的快排

快速排序快排的核心就是分治递归技术,简而言之就是不断的把大问题划分为小问题,利用小问题的解可以得出大问题的解,小问题再继续划分小小问题…..直到可以直接求出或较为简单的求出小小小…问题的解,即此时找到...

Sicily 找中位数(Memory Limit:2MB)

Description   给出一个含有N个数的无序数组,找出数列的中位数。当N是偶数,则中位数是数列排序后中间两个数的平均数;若N是奇数,则中位数就是数列排序后中间的那个数假设数组下标从0开始...

二分查找-两已排序数组中找中位数二题

第一题来自于《算法导论》第九章习题 9.3-8. 已知两个已排序数组X[n], Y[n](假设升序),问在时间O(lgn)内找到全部2n个数中的中位数。 给了提示时间O(lgn),那么必定使用二分查找...

一维带权邮局位置问题(找带权中位数)C++实现

带权 邮局位置问题: 已知n个点p1,p2,...,pn及与它们相联系的权重w1,w2,...,wn。我们希望能找到一点p(不一定是输入点中的一个),使和式            ...

查找中位数(java 快速排序)

中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一...

基于排序的方法求一组数的中位数(冒泡排序&选择排序) -- 浙大《数据结构》第二版 例2.6

基于排序的方法求一组数的中位数 这个例题写上两种方法。其实既然是基于排序的,那么方法的不同,区别就在采用的排序方法的不同。 自己想到的是冒泡排序(你说说你们,学了这么久的数据结构,连个冒泡排序都不会写...

【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)

求两个已排过序的等长的数组的中位数(median of two sorted arrays)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)