合并排序遵循分而治之的方法。
分意味着将一个问题分解为许多小的子问题。
治意味着递归地解决这些小的子问题,然后重新组合它们以创建原始问题的解决方案。
该方法MergeSort()
将数组分成相等的部分,直到每个元素分离为止,然后该方法Merge()
将它们重新组合,同时每次将它们连接到两个数组时对它们进行排序,就以排序的方式将它们连接起来,以便得到最终的排序数组。
#include <iostream> using namespace std; //合并两个数组 void Merge(int A[], int p, int q, int r) { //的大小 int n1 = q - p + 1, i, j, k; //n2是R [] int n2 = r - q; int L[n1], R[n2]; for (i = 0; i < n1; i++) { L[i] = A[p + i]; } for (j = 0; j < n2; j++) { R[j] = A[q + j + 1]; } i = 0, j = 0; for (k = p; i < n1 && j < n2; k++) { if (L[i] < R[j]) { A[k] = L[i++]; } else { A[k] = R[j++]; } } /* 如果l[]比r[]有更多的元素,那么它就会变成。 将l[]的所有元素都放到a[] */ while (i < n1) { A[k++] = L[i++]; } //如果R []的元素多于L [],则它将全部 //R []的重定义元素到A [] while (j < n2) { A[k++] = R[j++]; } } //它将划分数组并排序 //他们合并时 void MergeSort(int A[], int p, int r) { int q; if (p < r) { //q是划分数组的中间元素 q = (p + r) / 2; MergeSort(A, p, q); MergeSort(A, q + 1, r); Merge(A, p, q, r); } } int main(){ //A_Size为A []的大小 int A_Size; cout << "//输入元素数量: "; cin >> A_Size; int A[A_Size]; cout << "//输入数组元素: "; for (int i = 0; i < A_Size; i++) { cin >> A[i]; } MergeSort(A, 0, A_Size - 1); for (int i = 0; i < A_Size; i++) { cout << A[i] << " "; } cout << endl; return 0; }
输出结果
First Run: //输入元素数量: 5 //输入数组元素: 10 30 12 56 60 10 12 30 56 60 Second Run: //输入元素数量: 10 //输入数组元素: 10 20 50 60 77 88 34 43 1 45 1 10 20 34 43 45 50 60 77 88