主元素演算法

2021-09-01 07:46:07 字數 1422 閱讀 5738

1.演算法描述(演算法分析2.26)

大小為n的陣列a,其主元素是乙個出現超過n/2次的元素(從而這樣的元素最多只有乙個)。例如,陣列

3,3,4,2,4,4,2,4,4只有乙個主元素4; 3,3,4,2,4,4,2,4沒有主元素

求出主元素,沒有請指出

2.書中列出了一種演算法,暫且叫遞迴法,這可以自己看書,其複雜度也只有o(n)

下面介紹兩種其他的方法。

在網上還有其他一些方法:

3.方法一

思想就是利用主元素的個數是》n/2的這一性質,複雜度o(n)

*首先,隨機選取乙個作為主元素

*其次,依次遍歷陣列,遍歷中遇到相同的count++,否則count--

*如果<=0時在換主元素

*最後,剩下的就做為主元素的人選

*當然選出來的不一定就是主元素,還要檢測,如果檢測成功,那必定就是主元素,否則就沒有

int getmain(int* a, int length)

return seed;

}

這個方法很簡單,簡潔明瞭

4.方法二

方法二:利用快速排序,最後選取n/2處的元素作為主元素,複雜度為快速排序的複雜度

*當然選出來的不一定就是主元素,還要檢測,如果檢測成功,那必定就是主元素,否則就沒有

int getmain1(int* a, int length)
就是利用了快速排序

5.全部**

/**

*2.26找超過n/2次出現的主元素

**/#include using namespace std;

//檢查是否是主元素

bool check(int* a, int length, int n)

void swap(int &a, int &b)

//一次劃分

int partition(int *a, int first, int end)

return seed;

}/**

*方法二:利用快速排序,最後選取n/2處的元素作為主元素,複雜度為快速排序的複雜度

*當然選出來的不一定就是主元素,還要檢測,如果檢測成功,那必定就是主元素,否則就沒有

**/int getmain1(int* a, int length)

int main();

//動態獲取陣列的長度

int length = sizeof(a)/sizeof(int);

// int v = getmain(a, length);

int v = getmain1(a, length);

cout<<"length:"

return 0;

}

求陣列主元素的O n 演算法

在乙個規模為n的陣列a n 中,所謂主元素就是出現次數大於n 2的元素,例如 3.3.4.2.4.4.2.4.4 有乙個主元素為4。充分利用主元素的出現次數大於n 2這個已知條件,因為主元素的出現次數大於n 2,所以容易證明下面的解法是正確的 首先假設主元素是x,則遍歷陣列時出現與x相等的元素時,x...

尋找主元素

如果乙個陣列a 1.n 中超過半數的元素都相同時,該陣列被稱為含有主元素。演算法思想 利用快速排序的思想,如果這個陣列存在主元素,則它一定為排序後的中位數。但問題是,我們要設計o n 演算法,我們知道,排序的最優時間複雜度是o nlogn 所以我們需要借助其他的方法來完成這個問題。我們可以想到快速排...

搜尋主元素

題目描述 當陣列中每個元素出現的次數大於len 2時,該陣列的主元素就是就是該元素。演算法的設計思想 演算法的策略是從前往後掃瞄陣列元素,標記出乙個可能成為主元素的元素num。然後重新計數,確認num是否是主元素。演算法可分為兩步 1 選取候選的主元素 依次掃瞄所給陣列中的每個整數,將第乙個遇到的整...