直接上代码
#include<iostream>
using namespace std;
const int SIZE = 10;
void merge_sort(int* arr,int start, int end);
void sort(int* arr, int start,int mid,int end);
void show(int* arr, int size);
int main()
{
int arr[SIZE] = {
1,2,7,4,3,2,9,6,7,5
};
merge_sort(arr, 0, 9);
show(arr, SIZE);
return 0;
}
void merge_sort(int* arr, int start, int end)
{
if (start< end)
{
int mid = (start + end) / 2;
merge_sort(arr,start, mid);
merge_sort(arr, mid + 1, end);
sort(arr, start, mid, end);
}
}
void sort(int* arr, int start, int mid, int end)
{
//构建两个数组AB,将要排序的两段数据放入AB中
int lena = mid - start + 1, lenb = end - mid;
int* A = new int[lena];
int* B = new int[lenb];
for (int i = 0; i < lena; i++)
{
A[i] = arr[start + i];
}
for (int i = 0; i < lenb; i++)
{
B[i] = arr[mid + i+1];
}
//将AB两个数组进行排序
int i = 0, j = 0;
while (i<lena&&j<lenb)
{
if (A[i] > B[j])
{
arr[start] = A[i];
i++;
}
else
{
arr[start] = B[j];
j++;
}
start++;
}
//由于AB整体有序,将剩下的未排完的数据直接接到数组中排好的数据后面
if (i < lena)
{
while (i<lena)
{
arr[start] = A[i];
start++;
i++;
}
}
else
{
while (j < lenb)
{
arr[start] = B[j];
start++;
j++;
}
}
//释放动态分配的内存
delete[]A;
delete[]B;
}
void show(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
cout << arr[i]<<" ";
}
}
运行结果
思路简单介绍:递归分治。将整个数组分成小块。小块排序好之后再将小块排序合并大一点儿的块,直到合并成原数组