我的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
相似问题