递归与分治
递归实现合并排序:其中,算法merge合并2个排好序的数组到新的数组b中,然后由算法copy将合并后的
数组段再复制回数组a中。算法merge和copy显然可以在O(n)时间内完成,因此
合并排序算法对n个元素进行排序,在最坏情况下所需的计算时间T(n)=2T(n/2)+O(n)(n>1)
解此递归方程可知T(n)=)(nlogn)。
详解
实现
#include <vector>
#include <iostream>
#define DATANUM 10
using namespace std;
void Show(const vector<int> &arr, int length)
{
for (int i = 0; i < length; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int IsOrder(const vector<int>arr, int length)
{
for (int i = 0; i < length - 1; i++)
{
if (arr[i] > arr[i + 1])
{
return 0;
}
}
return 1;
}
//递归-归并排序
void Re_Merge(vector<int>& arr, vector<int>& brr, int left,int mid, int right)
{
int i = left, j = mid + 1;
int k = left;//brr的下标
while (i <= mid && j <= right)//只要左边和右边均有值,则继续比较
{
if (arr[i] <= arr[j])
{
brr[k++] = arr[i++];
// brr.push_back(arr[i]);
}
else
{
brr[k++] = arr[j++];
// brr.push_back(arr[j]);
}
}
while (i <= mid)//左半边还有值
{
brr[k++] = arr[i++];
/*brr.push_back(arr[i]);
i++;*/
}
while (j <= right)//左半边还有值
{
brr[k++] = arr[j++];
/*brr.push_back(arr[j]);
j++;*/
}
for (int m = left; m <= right; m++)
{
arr[m] = brr[m];
}
}
void Re_Divid(vector<int>& arr, vector<int>& brr, int left, int right)
{
int mid = (left + right) / 2;
if (left < right)//left == right 有一个值;left < right 至少两个值;left > right 没有值
{
Re_Divid(arr, brr, left, mid);
Re_Divid(arr, brr, mid + 1, right);
Re_Merge(arr, brr, left, mid, right);
}
}