建议直接看中文维基https://zh.wikipedia.org/zh-cn/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
上面代码写的挺好的
1、介绍:
算法动画:(来自维基:https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
)
2、简单版本:(递归)
版本1:
#include<iostream>
using namespace std;
void merge(int arr[], int left, int mid, int right)
{
int n1 = mid - left + 1; //leftPart数组的长度; [left,mid]
int n2 = right - mid; //rightPart数组的长度 [mid+1,right];
int *leftPart = new int[n1];
int *rightPart = new int[n2];
//复制到左右两边
for(int i = 0; i < n1; i++)
{
leftPart[i] = arr[left + i];
}
for(int i = 0; i < n2; i++)
{
rightPart[i] = arr[mid + i + 1]; //mid在左边
}
//左右两部分合并
int i = 0, j = 0, k = left;
while(i < n1 && j < n2)
{
if(leftPart[i] <= rightPart[j])
{
arr[k++] = leftPart[i++];
}
else
{
arr[k++] = rightPart[j++];
}
}
while(i < n1)
{
arr[k++] = leftPart[i++];
}
while(j < n2)
{
arr[k++] = rightPart[j++];
}
delete [] leftPart;
delete [] rightPart;
}
void mergeSort(int arr[],int left, int right)
{
if(left < right)
{
int mid = left + ((right - left)>>1);
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void printArray(int arr[],int len)
{
for(int i = 0; i < len; i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
int arr[] = {38, 27, 43, 3, 9, 82, 10};
cout<<"排序前:"<<endl;
int len = sizeof(arr)/sizeof(int);
printArray(arr, len);
mergeSort(arr, 0, len - 1);
cout<<"排序后:"<<endl;
printArray(arr, len);
return 0;
}
排序过程:
图片来自维基:https://en.wikipedia.org/wiki/File:Merge_sort_algorithm_diagram.svg
版本2:跟上面的差不多
#include<iostream>
using namespace std;
void merge(int arr[], int temp[], int left, int mid, int right)
{
int n1 = mid - left + 1; //leftPart数组的长度
int n2 = right - mid; //rightPart数组的长度
//左右两部分合并到temp[]中
int i = 0, j = 0, k = left;
while(i < n1 && j < n2)
{
if(arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while(i < n1)
{
temp[k++] = arr[i++];
}
while(j < n2)
{
temp[k++] = arr[j++];
}
for(int i = left; i < right; i++)
{
arr[i] = temp[i];
}
}
void mergeSort(int arr[],int temp[],int left, int right)
{
if(left < right)
{
int mid = left + ((right - left)>>1);
mergeSort(arr, temp, left, mid);
mergeSort(arr, temp, mid + 1, right);
merge(arr, temp, left, mid, right);
}
}
维基上的代码:
C
迭代版
#include<iostream>
using namespace std;
void merge_sort(int arr[], int len) {
int *a = arr;
int *b = new int[len];
int seg, start;
for (seg = 1; seg < len; seg += seg) {
for (start = 0; start < len; start += seg * 2) {
int low = start;
int mid = min(start + seg, len);
int high = min(start + seg * 2, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2)
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
}
//交换 a, b指向
int *temp = a;
a = b;
b = temp;
}
if (a != arr) {//a是不是指向原来的数组,不的话b指向原来的数组
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
delete [] b;
}