分治的基本思想:将原任务分成几个小任务(通常是两个)来分别完成,然后再将完成的几个任务经过处理后实现最终任务的完成。
归并排序的原理:
1.将待排序的数组分成两半
2.将数组的前一半和后一半分别排序。
3.将两半归并到新的有序数组,然后再拷贝回原来的数组。排序完成。
代码:
#include<iostream>
using namespace std;
void merge(int a[], int s, int m, int e, int tmp[]) {
//将a[]中排好序的前一半和后一半有序的放到tmp中,再拷贝回a[]
int i = s, j = m + 1;
int p = s;
while(i<=m&&j <= e)
{
if (a[i] < a[j])//a[s]<a[m+1]
{
tmp[p++] = a[i++];
}
else
{
tmp[p++] = a[j++];
}
}
//剩下的依次拷贝到tmp
while (i<=m)
{
tmp[p++] = a[i++];
}
while (j <= e)
{
tmp[p++] = a[j++];
}
//拷贝回a[]
i =s,p=s;
while (i <= e) {
a[i++] = tmp[p++];
}
}
void mergeSort(int a[], int s, int e, int tmp[]) {//s:要排序的初始位置 e:结束排序的位置
if (s < e)
{
int m =s+ (e - s) / 2;
mergeSort(a, s, m, tmp);
mergeSort(a, m + 1, e, tmp);
merge(a, s, m, e, tmp);
}
//退出条件:s=e,只剩一个元素结束排序
}
int main() {
int a[10] = { 1,2,6,41,11,17,23,0,98,5};
int b[10] = {0};//临时储存空间
int size = sizeof(a) / sizeof(int);
mergeSort(a, 0, size - 1, b);
for (int i = 0; i < size; i++) {
cout << a[i] << ' ';
}
system("pause");
return 0;
}
输出: