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回答

liuyubobobo

2019-12-19

对于近乎有序的数组,递归过程极度不均衡,时间退化成O(n^2),空间则也会退化成O(n)。因为递归深度近乎就等于n,如果n过大,就会导致系统栈空间不足而崩溃。


正因为如此,才会有后续我们关于快排的优化:)


继续加油!:)

0
2
liuyubobobo
回复
阿阳2017
继续加油!:)
2019-12-19
共2条回复

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

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

11187 学习 · 1614 问题

查看课程