知识点2——归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
主要思路:
知识点2——归并排序_第1张图片
当排序一个数组的时候,归并排序首先将这个数组分成一半,然后把左边的数组给排序,右边的数组给排序,之后再将它们归并起来;当对左边的数组和右边数组进行排序的时候,再分别将左边的数组和右边的数组分成一半,然后对每一个部分先排序,再归并。对于上面的每一个部分,依然是先将他们分半,再归并,分到一定细度的时候,每一个部分就只有一个元素了,那么此时不用排序,对他们进行一次简单的归并就好了。归并到上一个层级之后继续归并,归并到更高的层级,直至最后归并完成。
核心代码如下:

#include 
#include 
     
using namespace std;

void __merge(int* arr, int l, int mid, int r){	
	int* aux = new int[r - l + 1]; //aux数组为辅助空间
	for(int i = l; i <= r; i++){
		aux[i - l] = arr[i];
	}

	int i = l, j = mid + 1;
	for(int k = l; k <= r; k++){
		if(i > mid){
			arr[k] = aux[j - l];
			j++;
		}
		else if(j > r){
			arr[k] = aux[i - l];
			i++;
		}
		else if(aux[i - l] < aux[j - l]){
			arr[k] = aux[i - l];
			i++;
		}
		else{
			arr[k] = aux[j - l];
			j++;
		}
	}
	delete[] aux;
}

void __mergeSort(int* arr, int l, int r){
	if(l >= r)
		return;
	int mid = (l + r) / 2;
	__mergeSort(arr, l, mid);
	__mergeSort(arr, mid + 1, r);
	__merge(arr, l, mid, r);
}

void mergeSort(int* arr, int n){
	__mergeSort(arr, 0, n - 1);
}

int main(){
	int arr[] = {8,5,2,4,6,3,1,7};
	int length = sizeof(arr) / sizeof(arr[1]);
	mergeSort(arr, length);
	for(int i = 0; i < length; i++)
		cout << arr[i] << " ";
	cout << endl;

	return 0;
}

你可能感兴趣的:(知识点)