知识点2——归并排序

it2022-05-05  212

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

#include <iostream> #include <algorithm> 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; }

最新回复(0)