归并排序(nlogn)

来源:互联网 发布:好孩子淘宝店是正品吗 编辑:程序博客网 时间:2024/06/09 20:23

归并排序(自顶而下)

  1. #include <iostream>
  2. #include "InsertionSort.h"
  3. using namespace std;
  4. //将arr[l..mid]和arr[mid+1...r]两部分进行归并
  5. template<typename T>
  6. void __merge(T arr[], int l, int mid, int r){
  7. T aux[r-l+1];
  8. for(int i = l; i <= r; i++){
  9. aux[i - l] = arr[i];
  10. }
  11. int i = l, j = mid+1;
  12. for(int k = l; k <= r; k++){
  13. if(i > mid){
  14. arr[k] = aux[j-l];
  15. j++;
  16. }
  17. else if(j > r){
  18. arr[k] = aux[i-l];
  19. i++;
  20. }
  21. else if(aux[i-l] < aux[j-l]){
  22. arr[k] = aux[i-l];
  23. i++;
  24. }
  25. else{
  26. arr[k] = aux[j-l];
  27. j++;
  28. }
  29. }
  30. }
  31. //递归使用归并排序,对arr[l...r]的范围进行排序
  32. template<typename T>
  33. void __mergeSort( T arr[], int l, int r){
  34. //if(l >= r) return;
  35. //归并排序优化二
  36. // 对于小规模数组,使用插入排序
  37. if( r - l <= 15){
  38. insertionSort(arr, l, r);
  39. return;
  40. }
  41. int mid = (l+r)/2;
  42. __mergeSort(arr, l, mid);
  43. __mergeSort(arr, mid+1, r);
  44. //__merge(arr, l, mid, r);
  45. // 对于arr[mid] <= arr[mid+1]的情况,不进行merge
  46. // 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失
  47. if( arr[mid] > arr[mid+1] ) //归并排序优化一
  48. __merge(arr, l, mid, r);
  49. }
  50. template<typename T>
  51. void mergeSort( T arr[], int n){
  52. __mergeSort(arr, 0, n-1);
  53. }

归并排序(自底而上)


  1. //————————————自底向上归并排序————————————————————————————————————
  2. template<typename T>
  3. void mergeSortBU( T arr[], int n){
  4. //for(int sz = 1; sz <= n; sz += sz){
  5. //for(int i = 0; i + sz < n; i += sz + sz){
  6. //// 对 arr[i...i+sz-1] 和 arr[i+sz...i+2*sz-1] 进行归并
  7. //__merge( arr, i, i+sz-1, min(i+sz+sz-1, n-1) );
  8. //}
  9. //}
  10. //mergeSort Bottom Up 优化
  11. for(int i = 0; i < n; i += 16 )
  12. insertionSort(arr, i, min(i+15,n-1));
  13. for(int sz = 16; sz <= n; sz += sz){
  14. for(int i = 0; i < n-sz; i += sz + sz ){
  15. if( arr[i+sz-1] > arr[i+sz] )
  16.   __merge(arr, i, i+sz-1, min(i+sz+sz-1,n-1) );
  17. }
  18. }
  19. }

原创粉丝点击