排序算法---归并排序
1.归并排序
顾名思义,归并排序就是递归、合并排序。先把数组逐级划分,直至每个元素为单独的一个部分。
归并过程,先把数组复制一份,利用三个索引(k,i,j)对数组进行追踪。例如由于2>1,所以把1放在蓝色位置,然后k++,j++,进行下一个元素的处理。
---> ----->
#include<iostream> #include<algorithm> using namespace std; //将arr[left ... mid]和arr[mid+1 ... right]两部分进行归并 template <typename T> void __merge(T arr[], int left, int mid, int right){ int len = right - left + 1; int * aux = new int[len]; for (int i = left; i <= right; i++){ aux[i - left] = arr[i]; } int i = left, j = mid + 1; for (int k = left; k <= right; k++){ if (i>mid){ arr[k] = aux[j - left]; j++; } else if (j > right){ arr[k] = aux[i - left]; i++; } else if (aux[i - left] < aux[j - left]){ arr[k] = aux[i - left]; i++; } else{ arr[k] = aux[j - left]; j++; } } delete[] aux; } template <typename T> //自顶向下的递归方法 n---n/2----n/4----n/8... void __mergeSort(T arr[], int left, int right){ if (left >= right) { return; } int mid = (right - left) / 2 + left; __mergeSort(arr, left, mid);//0----3 __mergeSort(arr, mid + 1, right);//4---7 if (arr[mid] > arr[mid + 1]){ //加上这一步的判断,减少运算量 __merge(arr, left, mid, right); } } template <typename T> void mergeSort(T arr[], int n){ __mergeSort(arr, 0, n - 1); }
此外,还能采用自下而上的归并排序
//自下而上的归并排序 template <typename T> void mergeSortBU(T arr[], int n){ for (int sz = 1; sz <= n; sz += sz){ for (int i = 0; i + sz < n; i += sz + sz){ __merge(arr, i, i + sz - 1, min(i + sz + sz - 1, n)); } } }