我正在尝试在MatLab中实现快速排序。我有两个函数,一个将给定列表拆分为两个较小的列表,一个比枢轴小一个,一个小。第二个函数以递归方式调用快速排序并迭代到下一个较小的列表,再次调用快速排序。我的代码如下。当我用我的300个随机生成的数字列表运行代码时,我得到错误"内存不足。可能的原因是程序中的无限递归。"。
function [ less, pivot, greater ] = SplitList( list, pivotindex )
%List Splitting Function
%In order to preform quick sort you firts must be able to split the list
%into two, one which is greater than, and one which is less than the pivot.
pivot = list(1,pivotindex);
greater = [];
less = [];
for l = 1:length(list)
if list(1,l) > pivot
greater = [greater list(1, l)];
else if list(1,l) <= pivot
less = [less list(1, l)];
end
end
end
end
function [ qs_list ] = quick_sort( list )
%Recursive Quick Sort
% quick sort algorithm to sort a list of numbers
%set (0,'RecursionLimit',1000);
pivotindex = round(length(list)/2); %sets pivot at the median value of the array
if length(list) > 1
[ less, pivot, greater ] = SplitList( list, pivotindex ); %calls the SplitList function
qs_list = [quick_sort(less) pivot quick_sort(greater)]; %calls quick_sort within the function
else
qs_list = list;
end
end
答案 0 :(得分:1)
您的列表会在每次递归调用时生成一个元素。
让我们看看SplitList()
:返回的less
的元素数加上返回的greater
的元素数是参数list
的元素数。
但是,当您在quick_sort()
中递归地汇编已排序的列表时,会连接less
,greater
和 pivot
,这会增加{ {1}}与qs_list
相比,大小为1。
组装步骤应如下所示:
list
稍后修改
快速排序的一个优点是它可以对进行排序(即对未排序和排序的列表使用相同的内存区域)。这避免了重复需要排序的元素。
这意味着:您应该返回与参数相同的变量 qs_list = [quick_sort(less) quick_sort(greater)];
。否则,在每次调用时,您将消耗两倍的内存:未排序的list
的N个元素和部分排序的列表list
和less
的N个元素。假设平均时间复杂度为O(N×log(N)),则消耗O(2 N×log(N))= O(N×2 N )。难怪你的300个元素耗尽内存。
尝试像这样重写greater
:
SplitList
此外,您的function list = SplitList(list, beginindex, endindex, pivotindex)
...
需要以同样的方式重写。