归并排序(nlogn)
来源:互联网 发布:好孩子淘宝店是正品吗 编辑:程序博客网 时间:2024/06/09 20:23
归并排序(自顶而下)
#include <iostream>
#include "InsertionSort.h"
using namespace std;
//将arr[l..mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __merge(T arr[], int l, int mid, int r){
T aux[r-l+1];
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++;
}
}
}
//递归使用归并排序,对arr[l...r]的范围进行排序
template<typename T>
void __mergeSort( T arr[], int l, int r){
//if(l >= r) return;
//归并排序优化二
// 对于小规模数组,使用插入排序
if( r - l <= 15){
insertionSort(arr, l, r);
return;
}
int mid = (l+r)/2;
__mergeSort(arr, l, mid);
__mergeSort(arr, mid+1, r);
//__merge(arr, l, mid, r);
// 对于arr[mid] <= arr[mid+1]的情况,不进行merge
// 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失
if( arr[mid] > arr[mid+1] ) //归并排序优化一
__merge(arr, l, mid, r);
}
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){
//// 对 arr[i...i+sz-1] 和 arr[i+sz...i+2*sz-1] 进行归并
//__merge( arr, i, i+sz-1, min(i+sz+sz-1, n-1) );
//}
//}
//mergeSort Bottom Up 优化
for(int i = 0; i < n; i += 16 )
insertionSort(arr, i, min(i+15,n-1));
for(int sz = 16; sz <= n; sz += sz){
for(int i = 0; i < n-sz; i += sz + sz ){
if( arr[i+sz-1] > arr[i+sz] )
__merge(arr, i, i+sz-1, min(i+sz+sz-1,n-1) );
}
}
}
阅读全文
0 0
- 归并排序(nlogn)
- nlogn排序-归并排序
- 归并排序{nlogn}
- 归并排序-nlogn
- nlogn级别的排序算法(1)归并排序
- 归并排序平均时间复杂度O(NlogN)
- 归并排序求逆序对 O(nlogn)
- 求逆序对 (用归并) nlogn
- 两种O(nlogn)级别的排序,归并排序和快速排序
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 快速排序(分治法O(nlogn))
- 希尔排序(O(nlogn)-O(n2))
- 算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
- 求逆序对数的NLogN解法:归并排序、树状数组和线段树
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- nlogn排序-快速排序
- 合并排序(归并)
- 归并排序(ASC)
- 字符串匹配——一文吃透KMP算法
- DetourHook库使用
- 函数递归
- 购物车JS
- C和指针之字符串实现strrstr函数
- 归并排序(nlogn)
- 福建第六届省赛 最长连续串(贪心)
- 17 表达愿望
- asp.net Table 属性
- eclipse导入jar包的三种方法
- 软件测试流程
- 一级购物车
- 利用python3模拟访问网站
- 自定义view总结