如果乙個陣列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...