c 學習筆記(36) 利用快排尋找主元素

2021-06-09 16:37:20 字數 2059 閱讀 4235

如果乙個陣列a[1..n]中超過半數的元素都相同時,該陣列被稱為含有主元素。

演算法思想:

利用快速排序的思想,如果這個陣列存在主元素,則它一定為排序後的中位數。但問題是,我們要設計o(n)演算法,我們知道,排序的最優時間複雜度是o(nlogn),所以我們需要借助其他的方法來完成這個問題。

我們可以想到快速排序,當我們調整基準元素時,如果基準元素到達n/2,則說明左邊都比它小,右邊都比它大,這個數肯定就是中位數。我們只需要再遍歷一次陣列,看看陣列中和這個中位數相等的數的個數有幾個就可以了。如果大於n/2,則含有主元素,反之沒有。

時間複雜度為o(nlogn + n)

最終你找到的那個mid, 如果個數滿足主元關係,一定就是這個元素了

#include "iostream"

using namespace std;

int n, mid;

int partition(int arr, int low, int high)

return j;

}void quicksort(int arr, int low, int high)

} //quicksort 時間o(nlogn)

int main()

} if(count > n/2)

cout << "yes" << endl;

else

cout << "no" << endl;

delete arr;

cin.get();

cin.get();

return 0;

}

2.遞迴呼叫快排

#include "iostream"

using namespace std;

int n;

void quicksort(int arr, int low, int high)

arr[i] = pivot;

if(i > n / 2)

quicksort(arr, low, i - 1); //遞迴左邊

else if(i < n / 2)

quicksort(arr, i + 1, high); //遞迴右邊

else

return;

}int main()

quicksort(a, 0, n-1);

temp = a[n / 2];

for(int i = 0; i < n; i++)

if(count > n / 2)

cout << "the " << temp << " is the main element";

else

cout << "no element";

delete a;

cin.get();

cin.get();

return 0;

}

3利用程式設計之美中的求主元素的方法,利用findmainelement函式求出個數 > n/2 的那個元素,這樣求出後利用

#include "iostream"

using namespace std;

int n;

int findmainelement(const int arr, const int len)

else

//最後得到的是repeattime >= 1的,可能是真正的主元素,可能是最後乙個元素

} return mainelement;

}int main()

temp = findmainelement(a, n); //僅剩下最多的那個元素或者最後乙個元素

for(int i = 0; i < n; i++) //驗證這個元素是否是主元素。

if(count > n / 2)

cout << "the " << temp << " is the main element";

else

cout << "no element";

delete a;

return 0;

}

c 演算法學習之快排

一趟排序步驟 確定乙個基數作為分界值,一般用陣列的第乙個元素 定義 j j 為陣列最後乙個元素 從 j 開始從右至左比較,若 j 所在的元素小於基數,則停止比較 定義 i i 為陣列第乙個元素 從 i 開始從左至右比較,若 i 所在的元素大於基數,則停止比較 交換i j 所在元素 當 i j時,交換...

C學習 快排函式qsort使用小結

包含在標頭檔案void qsort void base,size t nmemb,size t size,int compar const void const void 引數說明 附帶函式 compar 該函式通常是自定義的,名字自取,格式如下 int compar const void a,co...

C 學習筆記 3 6 友元

乙個類的有元函式可以訪問該類的私有成員 class ccar 提前宣告ccar類,以便後面cdriver類使用 class cdriveer class ccar void cdriver modifycar ccar pcar intmostexpensicecar ccar cars,int t...