归并排序的C++代码实现

归并排序的C++代码实现

1.原理

​ 分治法,没什么好说的。需要注意的是写代码的时候。只要默念:分治左、分治右,归并,就可以了。额外的空间开销是不可避免的。时间复杂度 O(n*log n)。基本是排序算法中最稳定和鲁棒的了。可以通过几乎所有的 OJ。

2.C++代码实现

#pragma warning (disable:4996)
#include<cstdio>
#include<Windows.h>
using namespace std;
//right可以被取到
void merge(int arr[], int left,int mid, int right) {
	int *left_arr = new int[mid - left + 1];
	for (int i = left, j = 0; i <= mid; ++i)
		left_arr[j++] = arr[i];
	int *right_arr = new int[right - mid];
	for (int i = mid + 1, j = 0; i <= right; ++i)
		right_arr[j++] = arr[i];
	int left_index = 0, right_index = 0;
	for (int i = left; i <= right; ++i) {
		//根据判断条件,要么取左,要么取右。所以找到完全判断左的条件即可
		if (left_index < mid - left + 1 &&
			(left_arr[left_index] <= right_arr[right_index] || right_index >= right - mid)) {
			arr[i] = left_arr[left_index++];
		}
		else
			arr[i] = right_arr[right_index++];

	}
}
void mergesort(int arr[],int left,int right) {
	if (left >= right)
		return;
	else {
		int mid = (left + right) / 2;
		mergesort(arr,left, mid);
		mergesort(arr, mid + 1, right);
		merge(arr, left, mid, right);
	}
}
int main() {
	int arr[] = { 7,8,6,4,5,4,3 };
	int n = sizeof(arr) / sizeof(arr[0]);
	mergesort(arr,0, n - 1);
	for (int i = 0; i < n; ++i)
		printf("%d ", arr[i]);
	printf("\n");
	system("pause");
	return 0;
}
posted @ 2021-03-04 20:56  关河梦断  阅读(331)  评论(0)    收藏  举报