归并排序及改进

归并排序与插入排序
template<typename T>
void __Merge(T arr[], int l,int mid, int r)
{
	T* arr1 = new T[r - l + 1];
	int k = 0, i = l, j = mid + 1;
	for (; k < r - l + 1 && i<=mid &&j<=r; k++)
	{
		if (arr[i] >= arr[j])
			arr1[k] = arr[j++];
		else
			arr1[k] = arr[i++];
	}
	while(i<=mid)
		arr1[k++] = arr[i++];
	while (j <= r)
		arr1[k++] = arr[j++];
	for (int m = 0; m < r - l + 1; m++)
	{
		arr[m + l] = arr1[m];
	}
	delete[] arr1;
}
template<typename T>
void __MergeSort(T arr[], int l,int r)
{
	if (l == r)
		return;
	int mid = l + (r - l) / 2;
	__MergeSort(arr, l, mid);
	__MergeSort(arr, mid + 1, r);
	__Merge(arr, l, mid, r);
}
//归并排序
template<typename T>
void MergeSort(T arr[], int n)
{
	__MergeSort(arr, 0,n-1);
}

改进:

1、在区间范围较小时,元素有序的概率较大,改用插入排序。

2、如果两段区间满足前一段末尾小于等于后一段开头,则已经有序,不需要进行__Merge。

//插入排序
template<typename T>
void InsertionSort(T arr[], int l,int r)
{

	for (int i = l+1; i <= r; i++)
	{
		//写法3
		T temp = arr[i];
		int j = i;//保存元素temp应该插入的位置
		for (; j > l && arr[j - 1] > temp; j--)
		{
			arr[j] = arr[j - 1];
		}
		arr[j] = temp;
	}
}

template<typename T>
void __MergeSort(T arr[], int l,int r)
{
	if (r - l <= 15)
	{
		InsertionSort(arr, l, r);
		return;
	}
	int mid = l + (r - l) / 2;
	__MergeSort(arr, l, mid);
	__MergeSort(arr, mid + 1, r);
	if(arr[mid]>arr[mid+1])
		__Merge(arr, l, mid, r);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值