归并排序算法递归实现的个人理解
递归与非递归两种实现方案(使用C++实现)
首先介绍一下归并排序实现的基本思路
1.将数组array[n]对半划分,依次进行下去,直至得到n/2个子数组
2.对这n/2个数组依次进行排序
3.继续将数组进行划分,得到n/4个数组,由于之前的n/2个子数组已经排序完成,所以实际上是将上面的n/2个数组合并成排序完成的n/4个数组,并排序,依次类推至最终得到的n/n(即1)个数组则为排序完成的数组
代码实现如下:
首先介绍将子数组进行合并排序的函数
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
//比较两个子数组中的元素
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
//将剩下的元素赋值给temp
while (j <= n)
temp[k++] = a[j++];
while (i <= m)
temp[k++] = a[i++];
//将排序成功的temp数组里面的值赋值给原数组
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
递归实现排序
void MergeSort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
非递归实现
void MergeSort(int a[],int n){
int* temp = new int(n);
int size = 1,first,mid;//size为每次子数组的大小/2
while(size<n){
first=0;
while(first+size<n){
mid = first+size-1;//得到每次要归并的数组的中间下标
//归并数组的最后一个下标若超过数组大小则按n-1处理
mergesort(a,first,mid+size>n-1?n-1:mid+size,temp);
cout<<"first:"<<first<<" mid:"<<mid<<" last:"<<(mid+size>n-1?n-1:mid+size)<<endl;//打印出每次归并的区间
first = mid+size+1;
}
size*=2;
}
}