排序算法---归并排序
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);
}
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);
}
相关文章推荐
- 排序算法之归并排序(Mergesort)解析
- 排序算法总结之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 归并排序求逆序数(排序算法)
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 排序算法总结之归并排序
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 排序算法——归并排序
- 【排序算法】归并排序(C++实现)
- 排序算法 之 归并排序 MergeSort
- 排序算法--归并排序
- 排序算法之归并排序
- 排序算法-- 归并排序
- Pku acm 2299 Ultra-QuickSort 排序算法解题报告(四)----归并排序(MegerSort)求逆序数
- 排序算法之归并排序
- 基本排序算法及分析(五):归并排序
- 排序算法之归并排序
- 排序算法详解【归并排序-Merge_Sort】
- 排序算法1——归并排序