在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
Experimenting about Quick Sort in worst cases. It works well but in worst cases UnKnown error occurred. I think
这是一个关于内存访问的错误(不确定(。
我正在试验n个不同元素(n>0(的快速排序。即使元素超过数百万,它也能正确地为搅乱的数组运行,但当n>=4000时,它在最坏的情况下不起作用。
问题出在哪里?我该怎么解决?
这是python代码
import random
import time as tm
import sys
def Quick_Sort(A,s,e):
if s >= e:
return
p = A[s] #first # of the array is the povot
i = s
j = e
while i < j:
while i < e and A[i] <= p: #finding bigger numbers
i = i+1
while j > s and A[j] > p: #finding smaller numbers
j = j-1
if i < j:
A[i], A[j] = A[j], A[i]
A[s], A[j] = A[j], A[s] # sort the pivot
Quick_Sort(A,s,j-1) #subarray of smaller numbers
Quick_Sort(A,j+1,e) #subarray of bigger numbers
if __name__=='__main__':
sys.setrecursionlimit(10**6) #for expanding recursion limit
A=[]
size = 10000 #size of array
r_tm = 0
for i in range(1, size +1): # n distinct elements
A.append(i)
t=A[size-1] #worst case
A[1:size]=A[0:size-1]
A[0] = t
#random.shuffle(A) #it works well
s_tm = tm.time()
Quick_Sort(A,0,size-1)
e_tm = tm.time()
for i in range(0,size-1): #for checking array sorted well
if A[i] > A[i+1]:
print("Wrong, %d",i)
break
r_tm += round(e_tm - s_tm, 3)
print("size: %d, time: %f" %(size, r_tm))
这是c++代码
shell显示'流程已完成,退出代码为1073741571'
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
using namespace std;
void Quick_Sort(vector<int> &A, int s, int e);
int main() {
vector<int> A;
int c = 0;
std::random_device rd;
std::mt19937 g (rd());
int size = 4000;
A.push_back(size);
for (int i = 1; i < size; i++) {
A.push_back(i);
}
//shuffle(A.begin(),A.end(),g); //it works well
Quick_Sort(A, 0, size - 1);
for (int i = 1; i < size; i++) { //for checking array sorted well
if (A[i - 1] > A[i]) {
cout << "Wrong" << endl;
return 0;
}
}
}
void Quick_Sort(vector<int> &A, int s, int e) {
if (s >= e)
return;
int p = A[s]; //first # of array is the pivot
int i = s;
int j = e;
int tmp = 0;
while (i < j) {
while ((i < e) && (A[i] <= p)) //finding bigger numbers
i = i + 1;
while ((j > s) && (A[j] > p)) //finding smaller numbers
j = j - 1;
if (i < j) {
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
tmp = A[s]; //sort the pivot
A[s] = A[j];
A[j] = tmp;
Quick_Sort(A, s, j - 1); //subarray of smaller numbers
Quick_Sort(A, j + 1, e); //subarray of bigger numbers
}
这可能是由于堆栈溢出。在不好的情况下,递归需要O(大小(深度。
顺便说一句,这是在C++中实现快速排序的一种完全错误的方式。
为了避免堆栈溢出,在较小的部分递归,并在较大的部分循环。这将把堆栈复杂性限制为O(log(n((,但最坏情况下的时间复杂性仍然是O(n^2(。与本例相比,问题代码中还有其他问题。
def qsort(a, lo, hi):
while(lo < hi):
p = a[(lo + hi) // 2] # pivot
i = lo
j = hi
while(i <= j):
while(a[i] < p):
i += 1
while(a[j] > p):
j -= 1
if(i > j):
break
a[i],a[j] = a[j],a[i]
i += 1
j -= 1
# recurse on smaller part, loop on larger part
if((j - lo) <= (hi - i)):
qsort(a, lo, j)
lo = i
else:
qsort(a, i, hi)
hi = j
相关文章:
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在不进行排序的情况下查找数组中n个最小值的索引
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- std::regex 是否保证了最坏情况下的时间复杂度?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 使用c 中的sort()函数对字符串进行排序的最坏情况是什么是什么
- 如何在 c++ 中有效使用容器的情况下打印 5 个值的最大索引
- 在没有比较运算符的情况下查找 2 个数字之间的最小值
- 如何在不进行多次通过(C )的情况下找到最小的所有元素
- 获取当前目录,我可以在不知道最大缓冲区大小的情况下进行
- 如何在不删除任何字符的情况下将字符从字符串中的某个位置移动到其最前面
- 在给定某些约束的情况下,求出元素之间的最大距离
- 为什么在这种情况下不调用最合适的构造函数?
- 如何在不使用min_element C++的情况下找到向量中的最小值和最大值<double>
- 在最坏的情况下,多少QPI延迟可以减慢任意应用程序的速度
- 在实时应用程序中最坏情况下执行的最快c++映射
- 为什么在最坏的情况下unorder_set重哈希复杂度可能是O(n^2)
- 为什么c++程序要为局部变量分配比在最坏情况下需要的更多的内存?