隨機選擇演算法相關問題

2021-10-03 14:19:30 字數 731 閱讀 6435

給定乙個整數組成的集合,集合中的整數各不相同,現在要將它分為兩個子集合,使得這兩個子集合的並為原集合、交為空集,同時在兩個子集合的元素個數n1與n2之差的絕對值|n1-n2|盡可能小的前提下,要求他們各自的元素之和s1和s2之差的絕對值|s1-s2|盡可能大。求|s1-s2|。

使用隨機選擇演算法的原理就是,求這個整數集合的第n/2大,同時根據這個數把集合分為兩個部分,使得其中乙個子集元素都不小於這個數,另乙個都大於這個數。基於隨機快速排序演算法思想。

#include #include #include #include #include using namespace std;

const int maxn = 100010;

int a[maxn], n;

int randpartition(int a, int left, int right)

a[left] = temp;

return left;

}void randselect(int a, int left, int right, int k)

else

}int main()

randselect(a, 0, n - 1, n / 2);

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

printf("%d\n", (sum - sum1) - sum1);

return 0;

}

排序演算法相關

1.1氣泡排序 氣泡排序的基本原理是 依次比較相鄰的兩個數,將大數放在前面,小數放在後面,也即首先比較第乙個和第二個數,將大數放在前面,小數放在後面。然後比較第2個數和第3個數,將大數放前,小數方後,依次直至比較最後兩個數。如此在第一輪最後的數必定是所有數中最小的,然後重複以上過程將所有小數放在最後...

演算法相關 快排遞迴 隨機數

題目要求 思想 include include include include includeusing namespace std const int maxn 100010 int a maxn n 尋找n 2大的數字的位置,並根據這個位置把陣列分成兩半 思想 隨機選擇乙個數,一趟快排,然後遞迴...

雜湊演算法相關梳理

1.基本概念 雜湊也成為 雜湊 任意長度的輸入,經過雜湊演算法變換成固定長度的輸出。雜湊值會產生碰撞,因為固定長度的雜湊值表示的範圍是有限的,但輸入值的範圍是無限的。通過原始資料通過相同的雜湊演算法可以計算出相同的雜湊值,但是通過雜湊值無法恢復原始資料 不同的雜湊演算法,雜湊值長度不同,但相同的雜湊...