데이터 구조-노트

데이터 구조의 노트

제 1 정렬 알고리즘

  • 정렬 삽입 : 거의 정렬 된 어레이에 대한 시간 복잡도를 $의 O (n)은 $로 감소 될 수있다.
  • 정렬 병합 :
    • 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出来的空间不要忘记释放掉:)
    }
    

추천

출처www.cnblogs.com/simon-slrn/p/11361542.html