1. 程式人生 > >用快速排序找中位數

用快速排序找中位數

這個很好理解, 就像找前K個數一樣, 這個就像找前n/2個數, 不過這裡說只是要中位數就沒有必要找完了, 於是就可以大規模的剪枝;剪枝方法就是遞迴的時候對不可能有中位數的區間就直接減掉, 這個可是很大的一個剪枝, 效率急速上升

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace  std;
const int mmax = 10000001;
int a[mmax + 5] = {1, 2, 4, 6, 3, 7, 5, 9, 8, 11, 3};  //待排陣列
int quick_sort(int, int);
int len;                                               //需要排多少個數
bool ok;											   //是否已經找到中位數
int ans;												//找到的中位數
//尋找中位數的快拍
void quick(int left, int right){
	if(ok)
		return;
	if(left < right){                        //遞迴結束條件1
		int p = quick_sort(left, right);
		if(p == len / 2){                    //遞迴結束條件2
			ok = true;
			ans = a[p];
			return;
		}
		if(left < len / 2 && right > len / 2){   //剪枝,大幅度加快找的速度
			quick(left, p - 1);
			quick(p + 1, right);
		}
	}
}
//正常快排
void quick2(int left, int right){
	if(left < right){
		int p = quick_sort(left, right);
		quick2(left, p - 1);
		quick2(p + 1, right);
	}
}
void swaps(int *a, int *b){
	int *c = new int(10);
	*c = *a;
	*a = *b;
	*b = *a;
}
//快排核心
int quick_sort(int left, int right){
	int i = left, j = right;
	int x = a[left];
	while(i < j){
		while(i < j && a[j] >= x)
			j--;
		if(i < j)
		{
			a[i] = a[j];
			i++;
		}
		while(i < j && a[i] <= x){
			i++;
		}
		if(i < j)
		{
			a[j] = a[i];
			j--;
		}
	}
	return i;
}

//隨機生成len個隨機數
void su(){
	int len = mmax;
	for(int i = 0; i < len; i++){
		a[i] = rand() % 100000000;
	}
}

int main()
{
	len = mmax;
	ok = false;
	su();

	//只是找中位數的排序
	quick(0, len - 1);
	cout << ans << endl;

	
	//排完序後的中位數
	//是不是發現全部排完了再來找中位數很慢
	quick2(0, len - 1);
	cout << a[len / 2] << endl;

	return 0;
}

快速排序很多時候都是高速效率演算法的載體

相關推薦

快速排序位數

這個很好理解, 就像找前K個數一樣, 這個就像找前n/2個數, 不過這裡說只是要中位數就沒有必要找完了, 於是就可以大規模的剪枝;剪枝方法就是遞迴的時候對不可能有中位數的區間就直接減掉, 這個可是很大的一個剪枝, 效率急速上升 #include <iostream&g

二分查詢-兩已排序陣列位數二題

第一題來自於《演算法導論》第九章習題 9.3-8. 已知兩個已排序陣列X[n], Y[n](假設升序),問在時間O(lgn)內找到全部2n個數中的中位數。 給了提示時間O(lgn),那麼必定使用二分查詢。這道題的“梗”在於如何處理兩個已排序陣列。我們有總共2n個數,偶數,那

第1章第1節練習題10 查位數

str idt findmi proc borde 1.3 hidden argc -a 問題描寫敘述 一個長度為L(L ≥1) 的升序序列S。處在第 ? L/2 ? 個位置的數稱為S的中位數。比如,若序列S1=(11,13,15,17,19)S

leetcode 兩個排序位數 python

假設 lee pytho per oat sorted tran -s rap 兩個排序數組的中位數 給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2 。 請找出這兩個有序數組的中位數。要求算法的時間復雜度為 O(log (m+n))

位數第k小,還存在問題

找第k小 上次介紹了找第二大使用的方法時,使用錦標賽的方法,找到最大,在最大的手下敗將裡找第二大,也就是亞軍在冠軍的手下敗將裡產生,亞軍只敗給過冠軍,這種方法比較次數時(n-1) + (logn-1),這個時間複雜度最優的方案了為O(n) 那麼怎麼找第k大了,季軍只能在冠軍和亞軍的手下敗

位數

題目描述 中位數定義:一組資料按從小到大的順序依次排列,處在中間位置的一個數 (或最中間兩個資料的平均數). 給出一組無序整數,求出中位數,如果求最 中間兩個數的平均數,向下取整即可(不需要使用浮點數) 輸入描述: 該程式包含多組測試資料,每一組測試資料的第一行為N,代表該組測試資料 包含的資料個數,1

快速排序-常見軸(主元pivot)選擇方法及實現程式碼(末位/隨機/三數值/..)

一、選取最後一個元素 在我們的課本中,看到最多的就是選擇第一個元素作為中軸,但是在很多書上卻選擇最後一個元素作為中軸。下面就讓我們來一睹選取最後一個元素作為中軸的快排。 注:本文中的所有演算法都採用雙向掃描法,即,設兩個下標i和j,i和右掃描,j向左掃描,直到i不小

快速排序實現”小哼買書“

具體問題可以看看這個網站小哼買書。 下面是用快速排序實現的方法。 #include<stdio.h> int a[101], n;//定義全域性變數 //快速排序的實現方法 vo

LeetCode(40) Median of Two Sorted Arrays (兩排序陣列位數)

題目描述 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time

Hdu1157 完全的水題,排序值的

ACM部落格_kuangbin 新部落格kuangbin.org 人一我百,人十我萬!追逐青春的夢想,懷著自信的心,永不放棄! by kuangbin 新部落格 kuangbin.org ACM HDU 1157 Who’s in the Middle (完

scala 對大資料量排序位數 lookup方法

val rdd=sc.makeRDD(Array(1,8,6,4,9,3,76,4)) val sorted = rdd.sortBy(identity).zipWithIndex().map { case (v, idx) => (idx, v) }

C語言:快速排序演算法對一個數組進行排序

#include<stdio.h> #include<stdlib.h> #include<time.h> #define NUMBER 10 //NUMBER為陣

C產生正態分佈隨機數寫入檔案並讀出後快速排序排序

基於快速排序法的正態隨機數排序 使用中心極限定理產生正態分佈隨機數 使用快速排序法進行排序 讀寫資料到記事本 程式計時 #include <stdio.h> #include <stdlib.h> #include <mat

【原理思路】大資料位數(騰訊面試題)

題目: 在一個大檔案中有100億個32位整數,亂序排列,要求找出中位數;記憶體限制為512M;請寫出演算法設計思路; 基本分析: (1)中位數的定義:一個給定排序好的序列,奇數個的話,我們就取中間的一個;偶數個的話,我們一般取中間兩個數的平均值;因此對於本題,我們需得到中

從海量資料位數(c語言實現)

題目:5億個int,從中找出第k大的數 演算法:之後補上。。。 實現: #include <assert.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h&g

大根堆 小根堆 位數

集合中元素,前一半儲存在一個最大堆中,後一半儲存在一個最小堆中。 使用變數MaxHeapNum記錄最大堆元素的個數,使用變數MinHeapNum記錄最小堆元素的個數。控制MaxHeapNum與MinHeapNum的差不能超過1。每次將要插入的元素Num與最大堆頂部元素Max

LintCode#80FindMedian(利用快排位數)

題目:用時間複雜度為o(nlogn)的演算法,給定一個未排序的整數陣列,找到其中位數。中位數是排序後陣列的中間值,如果陣列的個數是偶數個,則返回排序後陣列的第N/2個數。 難度:Easy 思路:利用快

兩個排序陣列的位數

題目:給定兩個排序的陣列a,b,長度分別為m和n,找出這兩個陣列的中位數。時間複雜度為O(log(m+n))。 比如:a=[1,2,3,4],b=[2,3,4,]中位數為3。 假定a,b長度分別大於k,現在選擇第k個數(排序後的第k個),先將a的第k/2個元素(a[k/2

演算法筆記-快速排序之無序陣列查詢位數

問題描述: 給一個無序陣列array和陣列長度n,找出其中的中位數(這裡考慮n為奇數) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100