Data-Structure-Notes

Data Structure Notes

Chapter-1 Sorting Algorithm

  • Insert Sorting: For nearly ordered array can be reduced to the time complexity $ O (n) $ of.
  • Merge Sorting:
    • Tips1:Merge Sort Optimize in nearly ordered array
    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:When the sorting range of array in a short length, using InsertSort replace MergeSort can be more faster.
     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 to Up Merge Sorting : The algorithm can be usd in the LinkedList . The original MergeSort may preform better than this algorithm in normal situation.
    • Standard
    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));
            }
    }
    • Optimization
    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出来的空间不要忘记释放掉:)
    }
    

Guess you like

Origin www.cnblogs.com/simon-slrn/p/11361542.html