合并排序算法

                                         合并排序

 

合并排序是分治模式中的提出的一个排序方法。

 

分治模式在每一个递归中都有三个步骤:

      分解(devide):将原问题分解成一系列子问题。

       解决(Conquer):递归地解决各子问题。若子问题足够小,则直接求解。

       合并(Combine):将子问题的结果合并成原问题的解。

 

合并排序的是通过分治法把一个无序数组分成n/2等分,这是分解步骤。然后每个等分是一个子问题,因为子问题足够小所以进入到解决。解决后就进入合并,因为递归的性质合并后的结果又变成一个子问题,再合并,最终合并到原问题的解。

 

合并算法的T(n) = n*log2.n 

简单点儿看这个其实就是 max(每层比较次数)*深度。

 

T(n) = 2*T(n/2) + O(n)

 

 

             时间复杂度描述图:

代码段:

 

/****************************merge sort partment*****************************/

//[l, q] U [q+1, r]
void LXWSORT::pri_merge(int arr[], int l, int r, int q, int sortflag)
{
	int i = l;
	int k = l;
	int j = q+1;
	while( i <= q && j <= r )
	{
		if( sortflag == 0 ) {
			if( this->ptr_arr[i] < this->ptr_arr[j] ) {
				arr[k++] = this->ptr_arr[i++];
			} else {
				arr[k++] = this->ptr_arr[j++];
			}
		} else {
			if( this->ptr_arr[i] > this->ptr_arr[j] ) {
				arr[k++] = this->ptr_arr[i++];
			} else {
				arr[k++] = this->ptr_arr[j++];
			}
		}
	}//while
	if( i > q ) {
		for(j; j <= r; arr[k++] = this->ptr_arr[j++]);
	} else {
		for(i; i <= q; arr[k++] = this->ptr_arr[i++]);
	}

	//copy from arr to ptr_arr
	for(i = l; i <= r; i++)
		this->ptr_arr[i] = arr[i];
}


void LXWSORT::pri_merge_sort(int arr[], int l, int r, int sortflag)
{
	if(l < r)
	{
		int q = (r+l)/2;    //invide value
		pri_merge_sort(arr, l, q, sortflag);   //left
		pri_merge_sort(arr, q+1, r, sortflag); //right
		
		pri_merge(arr, l, r, q, sortflag);     //combine
	}

}


void LXWSORT::merge_sort(int sortflag)
{
	int *temp_arr = new int[length];
	pri_merge_sort(temp_arr, 0, length-1, sortflag);
	delete[] temp_arr;
}
/************************************************************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值