我的arr是1000000的大的数据的时候,归并排序和快速排序总是会出错然后退出,而且快速排序在100000的接近有序的数组排序也会出错然后退出。

来源:

magic圣骑士

2017-03-15

    //对arr[l...r]部分进行partition操作
    //返回p,使得arr[l...p-1] < arr[p] ; arr[p] < arr[p+1...r].
    template <typename T>
    int __partition(T arr[], int l, int r){
        T v = arr[l];
        int j = l;
        for(int i = l + 1; i <= r; i++ ){
            if(arr[i] < v)
            {
                swap(arr[j+1], arr[i]);
                j++;
            }

        }
        swap(arr[l], arr[j]);
        return j;
    }
    //对arr[l...r]部分进行快速排序
    template <typename T>
    void __quickSort(T arr[], int l, int r){
//        if(l >= r)
//            return;
        //第一层优化
        if(r - l <= 15) {
            insertionSort(arr, l, r);
            return;
        }


        int p = __partition(arr, l, r);
        __quickSort(arr, l, p-1);
        __quickSort(arr, p+1, r);
    }
    //快速排序
    template <typename T>
    void quickSort(T arr[], int n){
        __quickSort(arr , 0 , n-1);
    }
}


写回答

1回答

liuyubobobo

2017-03-15

你的代码我大致看是没有问题的。你遇到的这两个问题应该都是由于系统的栈空间不足导致的。也就是说你的系统阻止你递归层数过深。在linux系统下,系统栈空间大小直接由系统决定;但是windows下应该是由IDE决定的。所以你需要查一查自己的IDE如何扩充栈空间的大小。


另外,在近乎有序的情况下使用未经过优化的快排,对于10万的数据规模,即使栈空间够用,时间也很有可能是无法承受的。因为此时快排退化成了O(n^2)的算法。可以测试一下对于1万的数据规模,此时的时间是多少。对于10万的数据规模,时间将是100倍的差异:)

0
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程