分治思想:归并排序

算法思想:

已知一个待排序的数组a,把a的前一半进行排序,再把a的后一半进行排序,把2个已完成排序的数组进行归并排序到一个临时数组b中,然后把b中的数据再拷回a中即可。

时间复杂度:logn*n

空间复杂度:n

代码:

#include <iostream>
using namespace std;
void Merge(int arr[],int left,int mid,int right, int arr_temp[]);
void MergeSort(int arr[], int left, int right, int arr_temp[]);

int main()
{
	int arr[] = {15,6,11,7,5,99,22,3,2,67,45,12,23,1,43,55,0,8,17,58};//初始待排序数组
	int arr_temp[100];//临时数组
	int size = sizeof(arr) / sizeof(int);
	int left = 0, right = size - 1;
	MergeSort(arr, left, right, arr_temp);
	for (int i = 0; i < size; i++)
		cout << arr[i] << " ";
	return 0;
}

void MergeSort(int arr[], int left, int right, int arr_temp[])//定义的入参按照使用顺序进行的
{
	if (left < right)//当left比right小时,进行排序
	{
		int mid = (left + right) / 2;//mid,mid+1
		MergeSort(arr, left, mid, arr_temp);//将两个部分进行归并排序
		MergeSort(arr, mid + 1, right, arr_temp);
		Merge(arr, left, mid, right, arr_temp);
	}
}

void Merge(int arr[], int left, int mid, int right, int arr_temp[])
{
	int i = left, j = mid+1, k = 0;
	while (i <= mid && j <= right)//先把有序数据存入temp
	{
		if (arr[i] > arr[j])
			arr_temp[k++] = arr[j++];
		else
			arr_temp[k++] = arr[i++];
	}

	while (i <= mid )//注意这里是<=
		arr_temp[k++] = arr[i++];

	while (j <= right)//注意这里是<=
		arr_temp[k++] = arr[j++];

	//最后再把temp中的数据存回arr数组
	for (int n = 0; n < right- left + 1; n++)
		arr[left + n] = arr_temp[n];
}

归并排序主要是要理解归并过程中的分治思想,一个数组分成2个有序的部分,对这2个有序的部分进行排序即可。然后层层递归,将初始数组进行排序。

在自己动手撸码的过程中,要注意mid,mid+1,<=等细节部分即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值