matlab ——快速排序算法可视化

Posted yangyiqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab ——快速排序算法可视化相关的知识,希望对你有一定的参考价值。

matlab ——快速算法可视化

%快速排序第一步,第一次分区,实现基准数左边是小于它
%右边的数大于基准的,quick sort,
%理解快速排序关键一步
%作用,找出第一个数在序列中的位置(下标)
%参考资料https://blog.csdn.net/morewindows/article/details/6684558(感谢大佬)
% list_1=randperm(11)

clear
list_1 =[2,randperm(30),2]; %测试序列
N=length(list_1);
%初始化
L=1;   %从左边数据下标,
R=N;   %右边数据下标
tem = list_1(L);  %基准数

%%%主体程序
while L<R
    %%%从右往左找比tem小的值,比tem小就停止循环(并且L<R)
    %%%这里并不需要对比tem大的值进行操作
    while tem<list_1(R) && L<R
        R = R-1;
        
    end
    list_1(L)=list_1(R);  %将小值转移到基准数tem左边
    
    %%%从左往右找比tem大的值,比tem小就停止
    %%%这里并不需要对比tem小的值进行操作
    while tem>list_1(L) && L<R
       L=L+1;
    end
    list_1(R)=list_1(L); %将大值转移到基准数tem右边
    
end
   L
   list_1(L)=tem;   %将基准值放到相应位置
   list_1

%%主体
%%%%快速排序,调用函数
%my_quick_sort
clear
% global quick_list_1
list_1=[44,randperm(43),45];
%测试数组

L=1;
R=length(list_1);
cells_ls=list_1;
[list_1,cells_ls]=my_quick_sort(list_1,L,R,cells_ls);
stem(cells_ls(1,:));
pause(2)%暂停2秒
[ii,kk]=size(cells_ls);
for ni=2:ii
    drawnow
    pause(.05)
    stem(cells_ls(ni,:));
end

函数

% 快速排序,函数
function [mylist_1,cells_list]=my_quick_sort(mylist_1,my_L,my_R,cells_list)

% list_1 =[randperm(12),2,3,0];  测试序列
% N=length(list_1);

% 递归返回条件,最小边界
if my_L>=my_R
    return
end


% ki=1; % ki=1表示顺序是好的
% for ii=my_L:my_R-1
% % for ii=1:my_R-1
%     if mylist_1(ii)>mylist_1(ii+1)
%         ki=0;
%          break
%     end
% end
% if ki==1
%     return
% end
% %%%%第二个边界,这里这段非常重要,可以避免相互递归,可以大大降低运算时间
% %%%%并且这不会增加时间复杂度,因为下面循环的时间复杂度是O(n)
% %%%%而快速算法时间复杂度是O(nlogn)-O(n^2)



%初始化
L=my_L;   %左边数据下标,
R=my_R;   %右边数据下标
tem = mylist_1(L);  %基准数

%%%主体程序,用于找基准数该去的位置
while L<R
    %%%从右往左找比tem小的值,比tem小就停止循环(并且L<R)
    %%%这里并不需要对比tem大的值进行操作
    while  L<R && tem<mylist_1(R) 
        R = R-1;

    end
    if L<R
        mylist_1(L)=mylist_1(R); %将小值转移到基准数tem左边 
    end
    
    %%%从左往右找比tem大的值,比tem小就停止
    %%%这里并不需要对比tem小的值进行操作
    while L<R && tem>=mylist_1(L)
       L=L+1;
    end
    if L<R
        mylist_1(R)=mylist_1(L); %将大值转移到基准数tem右边
    end
end
  
   mylist_1(L)=tem;%将基准值放到相应位置
   
    cells_list=[cells_list;mylist_1];%%%发现并不符合
    


%通过测试,基本可以确定,在matlab,下面两个递归相互影响,数据量大时,很复杂
%递归相互影响会导致产生大量重复数据
%这里先递归??????想不明白
[mylist_1,cells_list]=my_quick_sort(mylist_1,1,L-1,cells_list);
%后递归,但是这里会重复递归,有什么解决方法?????????
[mylist_1,cells_list]=my_quick_sort(mylist_1,L+1,my_R,cells_list);


以上是关于matlab ——快速排序算法可视化的主要内容,如果未能解决你的问题,请参考以下文章

matlab 希尔算法可视化

MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”含matlab源代码

算法篇:快速排序

利用ZYNQ SOC快速打开算法验证通路——MATLAB浮点数与定点二进制补码互转

冒泡排序算法可视化

学习数据结构笔记====>不同的排序算法(Sort Algorithm)[冒泡,选择,插入,快速,希尔,基数,归并]