3.6节,近乎有序数组测试
来源:3-6 随机化快速排序法
阿阳2017
2019-12-19
3.6节,跟着视频写代码,C++,使用visual studio community 2017。
对于近乎有序数组排序进行测试,发现快排报错了:
(进程 18440)已退出,返回代码为: -1073741571。
我查代码-1073741571表示栈溢出。main.cpp代码如下:
#include
#include “SortTestHelper.h”
#include “MergeSort.h”
using namespace std;
// 对arr[l…r]部分进行partition操作
// 返回p,使得arr[l…p-1] < arr[p]; arr[p+1…r] > arr[p]
template
int __partition(T arr[], int l, int r) {
T v = arr[l];
// arr[l+1...j] < v; arr[j+1...i) > v
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
void __quickSort(T arr[], int l, int r) {
//if (l >= r)
// return;
// 优化1:小数据量使用插入排序
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
void quickSort(T arr[], int n) {
__quickSort(arr, 0, n - 1);
}
int main() {
int n = 1000000;
cout << "Test for Random Array, size = "<<n<<", random range [0, "<<n<<"]"<<endl;
int* arr1 = SortTestHelper::generateRandomArray(n, 0, n);
int* arr2 = SortTestHelper::copyIntArray(arr1, n);
SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
delete[] arr1;
delete[] arr2;
// 测试近乎有序的数组
int swapTimes = 100;
cout << "Test for Random Nearly Ordered Array, size = " << n << ", swap time = " << swapTimes << endl;
arr1 = SortTestHelper::generateNearlyOrderedArray(n, swapTimes);
arr2 = SortTestHelper::copyIntArray(arr1, n);
SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
delete[] arr1;
delete[] arr2;
return 0;
}
1回答
-
对于近乎有序的数组,递归过程极度不均衡,时间退化成O(n^2),空间则也会退化成O(n)。因为递归深度近乎就等于n,如果n过大,就会导致系统栈空间不足而崩溃。
正因为如此,才会有后续我们关于快排的优化:)
继续加油!:)
022019-12-19
相似问题