算法(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;
	}

}

 

posted @ 2020-02-05 09:57  jasmineTang  阅读(89)  评论(0)    收藏  举报