Algorithm Matlab中的快速排序调试

Algorithm Matlab中的快速排序调试,algorithm,matlab,sorting,quicksort,Algorithm,Matlab,Sorting,Quicksort,我需要帮助调试快速排序。在我调试时,它实际上在一定程度上对数组进行了正确排序,但在最后两个步骤中,它最终执行了不必要的交换,并返回了未排序的数组。我花了相当长的时间试图找出它的原因,但我没有取得任何进展 我选择分区作为第一个元素(我知道这不是最优的,但我只是想理解QS) 脚本: A = [3 6 2 5 1 7 4]; rightIndex = length(A); E = QuickSort(A,1,rightIndex); 快速排序: function [pvt, B] = QuickSo

我需要帮助调试快速排序。在我调试时,它实际上在一定程度上对数组进行了正确排序,但在最后两个步骤中,它最终执行了不必要的交换,并返回了未排序的数组。我花了相当长的时间试图找出它的原因,但我没有取得任何进展

我选择分区作为第一个元素(我知道这不是最优的,但我只是想理解QS)

脚本:

A = [3 6 2 5 1 7 4];
rightIndex = length(A);
E = QuickSort(A,1,rightIndex);
快速排序:

function [pvt, B] = QuickSort(A,left,right)

if left < right
    [B, pvt] = PartnPivot1(A, left, right); %chosen pivot
    QuickSort(B, left, pvt-1); 
    QuickSort(B, pvt+1, right);
end
function [sortedSubArray, pivot] = PartnPivot1(subArray,leftIndex,rightIndex)

%% Initializations
S = subArray;
left = leftIndex;
right = rightIndex;

P = S(left); %pivot
i = left+1;

%% Partition
for j = i:right
    if S(j) < P 
            temp1 = S(j); %
            temp2 = S(i); % swap S(i) with S(j) 
            S(j) = temp2; %
            S(i) = temp1; %
            i = i+1; %increment i only when swap occurs
    end
end
swap1 = S(left); %
swap2 = S(i-1);  % final swap 
S(left) = swap2; %
S(i-1) = swap1;  %

sortedSubArray = S;
pivot = P;
函数[pvt,B]=快速排序(A,左,右)
如果左<右
[B,pvt]=PartnPivot1(A,左,右);%选定轴心
快速排序(B,左,pvt-1);
快速排序(B,pvt+1,右);
结束
分区:

function [pvt, B] = QuickSort(A,left,right)

if left < right
    [B, pvt] = PartnPivot1(A, left, right); %chosen pivot
    QuickSort(B, left, pvt-1); 
    QuickSort(B, pvt+1, right);
end
function [sortedSubArray, pivot] = PartnPivot1(subArray,leftIndex,rightIndex)

%% Initializations
S = subArray;
left = leftIndex;
right = rightIndex;

P = S(left); %pivot
i = left+1;

%% Partition
for j = i:right
    if S(j) < P 
            temp1 = S(j); %
            temp2 = S(i); % swap S(i) with S(j) 
            S(j) = temp2; %
            S(i) = temp1; %
            i = i+1; %increment i only when swap occurs
    end
end
swap1 = S(left); %
swap2 = S(i-1);  % final swap 
S(left) = swap2; %
S(i-1) = swap1;  %

sortedSubArray = S;
pivot = P;
函数[sortedSubArray,pivot]=PartnPivot1(子数组,左索引,右索引)
%%初始化
S=子阵列;
左=左索引;
右=右索引;
P=S(左);%支点
i=左+1;
%%分割
对于j=i:对
如果S(j)

对QuickSort的递归调用需要将输出分配给某些变量,否则排序的数组将永远无法传回。我还认为你不需要返回枢轴

我在浏览器中输入,而不是在Matlab中测试,但我认为这可以做到

function A = QuickSort(A,left,right)

if left < right
    [A, pvt] = PartnPivot1(A, left, right); %chosen pivot
    A = QuickSort(A, left, pvt-1); 
    A = QuickSort(A, pvt+1, right);
end
函数A=快速排序(A,左,右)
如果左<右
[A,pvt]=PartnPivot1(A,左,右);%选定轴心
A=快速排序(A,左,pvt-1);
A=快速排序(A,pvt+1,右);
结束

MAtlab真的是编写快速排序的地方吗?@Mitchheat没有,但我正在努力提高我的MAtlab技能(实际上我对MAtlab相当陌生),所以我想我应该用MAtlab复习一些算法材料。我真的很感谢您的帮助。我得到了这个错误:在调用“[…]/QuickSort.m>QuickSort”时,没有分配输出参数“B”(可能还有其他参数)。@AlanH这是因为在left>=right时没有分配B。在我的更新中,我只是对所有内容使用变量A。