我的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倍的差异:)
00
相似问题