練車加端盤子也擋不住我學習系列 隨機選擇演算法

2021-10-08 09:12:53 字數 1556 閱讀 4940

廢話不多說,直接步入正題!

如何從乙個無序的陣列中求出第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...