归并算法解释:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
实现功能的代码如下
#include<iostream>
using namespace std;
void print(int a[], int n) {
for (int j = 0; j < n; j++) {
cout << a[j] << " ";
}
cout << endl;
return;
}
/*合并arr的左右两部分: arr[l..m] 和 arr[m+1..r] */
void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
/* 复制数据到 L[] 和 R[] */
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j <= n2; j++)
R[j] = arr[m + 1 + j];
/* 将两部分再合并到 arr[l..r]*/
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
/* 复制剩下的部分 L[] */
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
/* 复制剩下的部分 R[] */
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
/* 对数据arr排序,从l到r */
void mergeSort(int arr[], int l, int r)
{
if (l < r) {
//和 (l+r)/2 一样, 但是可以避免溢出当l和r较大时
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
return;
}
int main() {
int a[8] = { 5,1,2,3,7,4,8,6 };
int i, b[8];
mergeSort(a, 0, 7);
print(a, 8);
return 0;
}
网友评论