分治:
归并排序:把两个有序素组合并成1个。下面是示意图:
一路按组拆分,直到拆分到最后
接下里进行
实现代码
/*归并排序*/
//1.准备临时数组
//2.数据依序从原来数组中放入临时数组中
//2.1循环放完一半
//2.2 把2.1没有放完的部分 放完
//3.数据从临时数组拷贝回原函数,释放临时数组内存
//4.把一个数组
void mergesort(int* a, int l, int r) //递归 l为第一个元素的下标,r为最后一个元素的下标
{
if(l==r)
return;
int m = l + (r - l) / 2;
mergesort(a, l, m); //拆左边
mergesort(a, m + 1, r);//拆右边
merge_sort(a, l, m, r);//左右两边合并
}
void merge_sort(int* a, int l, int m, int r)
{
int len = r - l + 1;
int* p = new int[len];
int left = l;
int right = m + 1;
int k = 0;
while(left<=m&&right<=r)
{
if(a[left]<a[right])
p[k++] = a[left++];
else
p[k++] = a[right++];
}
while(right<=r)
p[k++] = a[right++];
while(left<=m)
p[k++] = a[left++];
memcpy(a+l, p, sizeof(int) * len);
delete[] p;
p = NULL;
}
void MergeSort(int *a, int len)
{
mergesort(a, 0, len - 1);
}
void test()
{
int aim2[10]={199,3,15,17,19,0,2,4,6,8};
MergeSort(aim2, 10);
cout << "start" << endl;
for (size_t i = 0; i < NUMBER; i++)
{
cout << aim2[i] << endl;
}
}
输出结果