2022年王道数据结构考研复习指导习题代码(排序)
8.3交換排序
2.編寫雙向冒泡算法,在正反兩個方向交替進(jìn)行掃描,即第一趟把關(guān)鍵字最大的元素放在序列的最后面,第二趟把關(guān)鍵字最小的元素放在序列的最前面,如此反復(fù)進(jìn)行。
3.已知線性表按順序存儲,且每個元素都是不相同的整形元素,設(shè)計把所有奇數(shù)移動到所有偶數(shù)前邊的算法(要求時間最少,輔助空間最少)。
#include <iostream> #include <algorithm> using namespace std;typedef int ElemType;ElemType A[50];void move(ElemType A[], int len) {int i = 0, j = len - 1;while (i < j) {while (i < j && A[i] % 2 != 0) i++;while (i < j && A[j] % 2 != 1) j--;if (i < j) {swap(A[i], A[j]);i++; j--;}} }int main() {int n;cin >> n;for (int i = 0; i < n; i++) cin >> A[i];move(A, n);for (int i = 0; i < n; i++) cout << A[i] << " ";cout << endl;return 0; }4.試重新編寫考點精析中的快速排序的劃分算法,使之美詞選取的樞軸值都是隨機地從當(dāng)前子表中選擇的。
#include <cstdlib> #include <iostream> using namespace std;typedef int ElemType;ElemType A[50];int Partition2(ElemType A[], int low, int high) {int rand_Index = low + rand() % (high - low);swap(A[rand_Index], A[low]);ElemType pivot = A[low];int i = low;for (int j = low + 1; j <= high; j++)if (A[j] < pivot) swap(A[++i], A[j]);swap(A[i], A[low]);return i; }void QuickSort(ElemType A[], int low, int high) {if (low < high) {int pivotpos = Partition2(A, low, high);QuickSort(A, low, pivotpos - 1);QuickSort(A, pivotpos + 1, high);} }int main() {int n;cin >> n;for (int i = 1; i <= n; i++) cin >> A[i];QuickSort(A, 1, n);for (int i = 1; i <= n; i++) cout << A[i] << " ";cout << endl;return 0; }5.試編寫一個算法,使之能夠在數(shù)組L[1…n]中找出第k小的元素(即從小到大排序后處于第k個位置的元素)。
#include <cstdlib> #include <iostream> #include <algorithm> using namespace std;int a[50];int kth_elem(int a[], int low, int high, int k) {int rand_Index = low + rand() % (high - low + 1);swap(a[rand_Index], a[low]);int pivot = a[low];int low_temp = low; int high_temp = high;while (low < high) {while (low < high && a[high] >= pivot) --high;a[low] = a[high];while (low < high && a[low] <= pivot) ++low;a[high] = a[low];}a[low] = pivot;if (low == k) return a[low];else if (low > k) return kth_elem(a, low_temp, low - 1, k);else return kth_elem(a, low + 1, high_temp, k); }int main() {int n, k;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];cin >> k;int ans = kth_elem(a, 1, n, k);cout << ans << endl;return 0; }6.已知由n(n≥2)n(n \geq 2)n(n≥2)個正整數(shù)構(gòu)成的集合A=ak∣0≤k<nA={a_{k}|0 \leq k < n}A=ak?∣0≤k<n,將其劃分為兩個不相交的子集A1A_{1}A1?和A2A_{2}A2?,元素個數(shù)分別是n1n_{1}n1?和n2n_{2}n2?,A1A_{1}A1?和A2A_{2}A2?中的元素之和分別為S1S_{1}S1?和S2S_{2}S2?。設(shè)計一個盡可能高效的劃分算法,滿足∣n1?n2∣|n_{1}-n_{2}|∣n1??n2?∣最小且∣S1?S2∣|S_{1}-S_{2}|∣S1??S2?∣最大。
#include <iostream> using namespace std;int a[50];int setPartition(int a[], int n) {int pivotkey, low = 0, low0 = 0, high = n - 1, high0 = n - 1, flag = 1, k = n / 2, i;int s1 = 0, s2 = 0;while (flag) {pivotkey = a[low];while (low < high) {while (low < high && a[high] >= pivotkey) --high;if (low != high) a[low] = a[high];while (low < high && a[low] <= pivotkey) ++low;if (low != high) a[high] = a[low];}a[low] = pivotkey;if (low == k - 1) flag = 0;else {if (low < k - 1) {low0 = ++low;high = high0;} else {high0 = --high;low = low0;}}}for (i = 0; i < k; i++) s1 += a[i];for (i = k; i < n; i++) s2 += a[i];return s2 - s1; }int main() {int n;cin >> n;for (int i = 0; i < n; i++) cin >> a[i];int ans = setPartition(a, n);cout << ans << endl;return 0; }7.荷蘭國旗問題:設(shè)有一個僅有紅、白、藍(lán)三種顏色的條塊組成的條塊序列,請編寫一個時間復(fù)雜度為Q(n)Q(n)Q(n)的算法,使得這些條塊按紅、白、藍(lán)的順序排好,即排成荷蘭國旗圖案。
#include <cstdlib> #include <iostream> #include <algorithm> using namespace std;char a[50];void Flag_Arrange(char a[], int n) {int i = 0, j = 0, k = n - 1;while (j <= k) {switch (a[j]) {case 'R': swap(a[i], a[j]); i++; j++; break;case 'W': j++; break;case 'B': swap(a[j], a[k]); k--;}} }int main() {cin >> a;int n = strlen(a);Flag_Arrange(a, n);for (int i = 0; i < n; i++) cout << a[i];return 0; }8.4選擇排序
4.編寫一個算法,在基于單鏈表表示的帶排序關(guān)鍵字序列上進(jìn)行簡單選擇排序。
5.試設(shè)計一個算法,判斷一個數(shù)據(jù)序列是夠構(gòu)成一個小根堆。
#include <iostream> using namespace std;typedef int ElemType;ElemType A[50];bool IsMinHeap(ElemType A[], int len) {if (len % 2 == 0) {if (A[len / 2] > A[len]) return false;for (int i = len / 2 - 1; i >= 1; i--)if (A[i] > A[2 * i] || A[i] > A[2 * i + 1]) return false;} else {for (int i = len / 2; i >= 1; i--)if (A[i] > A[2 * i] || A[i] > A[2 * i + 1]) return false;}return true; }int main() {int n;cin >> n;for (int i = 1; i <= n; i++) cin >> A[i];if (IsMinHeap(A, n)) cout << "Yes" << endl;else cout << "No" << endl;return 0; }8.6各種內(nèi)部排序算法的比較與應(yīng)用
4.設(shè)有一個數(shù)組中存放了一個無序的關(guān)鍵序列K1,K2,…,KnK_{1},K_{2},…,K_{n}K1?,K2?,…,Kn?。現(xiàn)要求將KnK_{n}Kn?放在將元素排序后的正確位置上,試編寫實現(xiàn)該功能的算法,要求比較關(guān)鍵字的次數(shù)不超過nnn。
總結(jié)
以上是生活随笔為你收集整理的2022年王道数据结构考研复习指导习题代码(排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openBravo数据库结构分析
- 下一篇: wget php mirror 地址,w