基础算法-归并排序

归并排序

  • 算法思想:分治法

  • 时间复杂度:O(nlogn)

  • 空间复杂度:O(n)

  • 基本过程:

  • 第一步:选择一个标准,将区间一分为二

  • 第二步:合并两个区间,较小或者较大者复制到临时数组里

  • 第三步:重复以上过程,直到越界

  • 代码:
写法一:
#include 
#include 

using namespace std;

void mergeSort(vector<int> &arr, int L, int R){
	if (L >= R) return;
	//第一步
	int mid = L + R >> 1;
	mergeSort(arr, L, mid);
	mergeSort(arr, mid + 1, R);
	//第二步
	int k = 0, p1 = L, p2 = mid + 1;
	vector<int> tmp(R - L + 1, 0);
	while (p1 <= mid && p2 <= R) {
		tmp[k++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
	}
	//剩余情况
	while (p1 <= mid) tmp[k++] = arr[p1++];
	while (p2 <= R) tmp[k++] = arr[p2++];
	//拷贝回原来的数组
	for (int i = L, j = 0; i < R; i++, j++) arr[i++] = tmp[j++];
}
写法二:
#include 
#include 

using namespace std;

void merge(vector<int> &arr, int L, int M, int R) {
	int k = 0, p1 = L, p2 = M + 1;
	vector<int> help(R - L + 1, 0);
	while (p1 <= M + 1 && p2 <= R) {
		help[k++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
	} 
	while (p1 <= M + 1) help[k++] = arr[p1++];
	while (p2 <= R) help[k++] = arr[p2++];
	
	for (int i = 0; i < help.size(); i++) arr[L + i] = help[i]; 
}

void mergeSort(vector<int> &arr, int L, int R) {
	if (L == R) return;
	else {
		int mid = L + (R - L) >> 1;
		mergeSort(arr, L, mid);
		mergeSort(arr, mid + 1, R);
		merge(arr, L, mid, R);
	}
}

void mergeSort(vector<int> &arr) {
	if (arr.size() < 2) return;
	mergeSort(arr, 0, arr.size() - 1);
}

你可能感兴趣的:(数据结构与算法学习,算法,学习,排序算法)