정렬 병합 :
- Tips1는 : 거의 순서 배열에 최적화 정렬 병합
void __mergeSort(T arr[], int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2; // variable 'mid' may overflow
__mergeSort(arr, l, mid);
__mergeSort(arr, mid+1, r);
if(arr[mid] > arr[mid+1]) // optimize in nearly ordered array.
__merge(arr, l, mid, r);
}
- Tips2 : InsertSort가 머지 소트을 대체하여 짧은 길이 배열의 정렬 범위가 더 빠르게 할 수있는 경우.
template<typename T>
void __mergeSort(T arr[], int l, int r) {
//if (l >= r) return;
if (r - l <= 15) { // The '15' is a constant represent the minmum judge range.
InsertionSort(arr, l, r);
return;
}
int mid = (l + r) / 2; // variable 'mid' may overflow
__mergeSort(arr, l, mid);
__mergeSort(arr, mid+1, r);
if(arr[mid] > arr[mid+1]) // optimize in nearly ordered array.
__merge(arr, l, mid, r);
}
최대 botton을가 정렬을 병합 알고리즘은 LinkedList의 미화 될 수 있습니다. 원래 머지 소트 정상적인 상황에서이 알고리즘보다 더 나은 미리 형성 할 수있다.
template<typename T>
void mergeSortBottonToUp(T arr[], int n) {
for(int size = 1; size <= n; size += size)
// In order to assure exist two sperate array, setting (i+size < n) not (i < n)
for (int i = 0; i + size < n ; i += size + size) {
// merge arr[i ... i+size-1] and arr[i+size ... i+2*size-1]
// In order to assure latter array isn't overflow so use min(i + size + size - 1, n-1) to choosing a right part.
__merge(arr, i, i + size - 1, min(i + size + size - 1, n-1));
}
}
template <typename T>
void mergeSortBU2(T arr[], int n){
// 对于小规模数组, 使用插入排序
for( int i = 0 ; i < n ; i += 16 )
insertionSort(arr,i,min(i+15,n-1));
// 一次性申请aux空间, 并将这个辅助空间以参数形式传递给完成归并排序的各个子函数
T* aux = new T[n];
for( int sz = 16; sz <= n ; sz += sz )
for( int i = 0 ; i < n - sz ; i += sz+sz )
// 对于arr[mid] <= arr[mid+1]的情况,不进行merge
// 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失
if( arr[i+sz-1] > arr[i+sz] )
__merge2(arr, aux, i, i+sz-1, min(i+sz+sz-1,n-1) );
delete[] aux; // 使用C++, new出来的空间不要忘记释放掉:)
}