用快速排序找中位數
這個很好理解, 就像找前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
有一個整數陣列,請你根據快速排序的思路,找出陣列中第K大的數。 給定一個整數陣列a,同時給定它的大小n和要找的K(K在1到n之間),請返回第K大的數,保證答案存在。
一, 原快速排序的實現 http://blog.csdn.net/taotaoah/article/details/50987837 using System; namespace taotao {
演算法筆記-快速排序之無序陣列中查詢中位數
問題描述: 給一個無序陣列array和陣列長度n,找出其中的中位數(這裡考慮n為奇數) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100