在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想

Experimenting about Quick Sort in worst cases. It works well but in worst cases UnKnown error occurred. I think

本文关键字:情况下 最坏 错误 我想 未知 运行 快速排序      更新时间:2023-10-16

这是一个关于内存访问的错误(不确定(。

我正在试验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
相关文章: