算法(11)-归并-C++
与荷兰国旗相比,归并主要是二分。
1.分左右,[left-mid],[mid+1,right],
2.两边Merge,就是分别取数,比小后放入辅助数组中,以上两步不停递归,
3.basecase为left==right,最后完成排序。
时间复杂度为O(logn)。以下为C++实例代码,亲测可行,供各位参考。
void merge(int arr[], int l, int m, int r)
{
int m_num = r - l + 1;
int *help = new int[m_num];//辅助数组
int i = 0;
int p1 = l;//左指针
int p2 = m + 1;//右指针
while (p1 <= m && p2 <= r) //左右指针不越界
{
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];//左右哪个小 哪个放在辅助数组中
}
while (p1 <= m) //左边没排完,剩下的拷入辅助数组中
{
help[i++] = arr[p1++];
}
while (p2 <= r) //右边的没排完,剩下的拷入辅助数组中
{
help[i++] = arr[p2++];
}
for (i = 0; i < m_num; i++)//考回原数组
{
arr[l + i] = help[i];
}
delete[]help;
}
//递归函数
void mergeProcess(int arr[], int l, int r)
{
if (l == r) { return; }//basecase
int mid = l + ((r - l) >> 1);
mergeProcess(arr, l, mid);
mergeProcess(arr, mid + 1, r);
merge(arr, l, mid, r);
}
//排序主函数
void mergeSort_main(int arr[], int m_num)
{
cout << "mergeSort******************" << endl;
int l = 0;
int r = m_num - 1;
if (arr == NULL || m_num < 2) { return; }
mergeProcess(arr,0,m_num-1);
for (int i = 0; i < m_num; i++)
{
cout << arr[i] << endl;
}
}

浙公网安备 33010602011771号