1. 程式人生 > 其它 >matlab ——快速排序演算法視覺化

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);