廢話不多說,直接步入正題!
如何從乙個無序的陣列中求出第k大的數?
常規思想
直接選擇排序從小到大,然後直接找出第k個數即可。時間複雜度為o(n^2)。總的來說,這不是乙個很好的演算法!
隨機選擇演算法的原理類似於隨機快速排序演算法。當對a[left,right]執行一次randpartition函式之後,主元左側的元素個數就是確定的,且它們都小於主元。假設此時主元是a[p],那麼a[p]就是a[left,right]中的第乙個p-left+1大的數。不妨令m表示p-left+1,那麼如果k與m相等成立,說明第k大的數就是主元a[p];如果kint
randpartition
(int n,
int left,
int right)
n[left]
= temp;
//把temp放在left和right相遇的地方
return left;
//返回相遇下標
}int
randselect
(int a,
int left,
int right,
int k)
給定乙個由整數組成的集合,集合中的整數各不相同,現在要將它分為兩個子集合,使得這兩個子集合的並為原集合,交為空,同時在這兩個子集合的元素個數n1和n2之差的絕對值盡可能小的情況下,它們各自的元素之和s1和s2之差的絕對值盡可能大。求|s1-s2|的值。
#include
#include
#include
#include
#include
using
namespace std;
//選取隨機主元,對區間[left,right]進行劃分
intrandpartition
(int n,
int left,
int right)
n[left]
= temp;
//把temp放在left和right相遇的地方
return left;
//返回相遇下標
}//隨機選擇演算法,從n[left,right]中找到第k大的數,並進行劃分
void
randselect
(int n,
int left,
int right,
int k)
else
}int
main()
;int sum =0;
for(
int i =
0; i <
13; i++
)randselect
(n,0,13
-1,13
/2);
int sum1 =0;
for(
int i =
0; i <13/
2; i++
)printf
("\n%d\n"
,(sum - sum1)
- sum1)
;return0;
}
練車加端盤子也擋不住我學習系列 歸併排序演算法
歸併排序,是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 1945年由約翰 馮 諾伊曼首次提出。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。速度僅次於快速排序,為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的...
練車 科目二
大一暑假,還是決定先報名把駕照拿下,由於回家鄉考駕照各種不方便,爸媽又疼我,讓我在這邊考駕照。於是報了半年拿證的5000駕校,德安駕校。報名要居住證,辦理又花了個把月,報完名稀里糊塗就開始準備科目一,體檢什麼的都包辦了,乙個暑假幾乎都在家宅著過了,花了幾天時間刷科目一題目,臨開學又練了3天車,開學當...
演算法小練 加一
title 演算法小練 加一 date 2019 11 09 19 43 59 categories 給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2...