您的位置:首页 > 其它

排序算法---归并排序

2016-11-23 21:59 183 查看
一、归并排序的思想:

1.每次将一组数分为两组,直到不能再分为止;

2.从个数最小的数组开始比较,每次将比较大(或小)的数放入辅助数组中,辅助数组的下标+1,如此循环,直到有一个数组比较完,此时如果另外一个数组有剩余,就将剩余的这些数字全部按顺序加入辅助数组中。从最小的数组向上一步步累加,如果每次小的数组有序,那么合并以后的数组就有序。(下面这幅图给出的是一种分割两个数组的方法,分的时候最好从中间分)



二、归并排序的递归实现

void _MergeSort(int* a,int* tmp,int left,int right)
{
int mid = left + ((right-left)>>1); //每次找到当前数组的中位数
if (left < mid)
_MergeSort(a,tmp,left,mid);
if (mid+1 < right)
_MergeSort(a,tmp,mid+1,right);

int begin1 = left; //指向第一个数组开始
int end1 = mid;
int begin2 = mid+1; //指向第二个数组开始
int end2 = right;
int index = left; //辅助数组tmp的下标
while (begin1 <= end1 && begin2 <= end2) //只要有一个区间的数据取完完就停止循环
{
if (a[begin1] < a[begin2])
tmp[index++] = a[begin1++];
else
tmp[index++] = a[begin2++];
}

//将两个区间中较长区间的剩余部分拷贝完
while(begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while(begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
//每次将排好序的辅助数组中的值重新赋给原来数组
for (int i=0; i<index; ++i)
{
a[i] = tmp[i];
}
}
void MergeSort(int* a,int begin, int end)
{
assert(a);

//int tmp[10];
int* tmp = new int[end-begin+1];
_MergeSort(a,tmp,begin,end);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序