您的位置:首页 > 其它

归并排序

2016-05-03 21:24 337 查看
思想不多说,直接上一张图:(图是盗取的奥,快闭馆了,的抓紧时间):



先分解,排序,然后合并,一下是代码:

#pragma once

//合并两个分组的
void MergeSection(int *a, int *tmp, int begin1, int end1, int begin2, int end2)
{
int index = 0;
while (begin1 <= end1 && begin2 <= end2)   //两个子集合并
{
if (a[begin1] <= a[begin2])      //把小的放在index = 0的位置 以此类推
tmp[index++] = a[begin1++];
else
tmp[index++] = a[begin2++];
}

//还少几种情况,如下

while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}

while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
}

//归并排序
void _MergeSort(int *a, int *tmp, int left,int right)
{
assert(a);

if (left >= right)
{
return;
}

int mid = left + (right - left) / 2;

_MergeSort(a, tmp,left,mid);
_MergeSort(a, tmp, mid+1,right );

MergeSection(a,tmp,left,mid,mid+1,right);

for (int i = 0; i < (right - left + 1); ++i)
{
a[left+i] = tmp[i];
}
}

void MergeSort(int *a, int size)
{
int *tmp = new int[size];  //相当于第三方数组 用来合并
memset(tmp,0,sizeof(int)*size);
_MergeSort(a, tmp, 0, size - 1);
delete[] tmp;
}
赐教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: