先貼個題目:
以及原題鏈接:787. 歸并排序 - AcWing題庫https://www.acwing.com/problem/content/789/純板子題,先貼代碼吧,根據代碼講思路:
#include <iostream>
using namespace std;const int N = 1e5 + 10;
int a[N], tmp[N];void gsort(int str[],int left, int right)
{if (left >= right)return;int mid = (left + right) / 2;gsort(str,left, mid);gsort(str,mid + 1, right);int x = left, y = mid + 1, z = 0;while (x <= mid && y <= right){if (str[x] <= str[y])tmp[z++] = str[x++];elsetmp[z++] = str[y++];}while (x <= mid)tmp[z++] = str[x++];while (y <= right)tmp[z++] = str[y++];for (int i = left, j = 0; i <= right; ++i, ++j)str[i] = tmp[j];return;
}int main()
{int n;cin >> n;for (int i = 0; i < n; ++i)cin >> a[i];gsort(a,0, n-1);for (int i = 0; i < n; ++i)cout << a[i] << " ";return 0;
}
?每次把要分的數組分成兩部分,然后因為遞歸到數組中只存在一個數,然后是兩個數,以此類推,我們待會再來講排序的原理,先默認他就是有序的,那利用兩段有序數組,實現整個合并大數組的有序即可。至于原理,就是創建一個臨時的數組,然后如果左邊數字小于于等于右邊數字,就讓左邊數字進入到臨時數組中, 然后記錄的下標都右移一格,如此就能歸并了。
by————2024.2.28刷題記錄
?