1. 程式人生 > 其它 >排序演算法在matlab中的視覺化(一)

排序演算法在matlab中的視覺化(一)

排序演算法在matlab中的視覺化(一)

氣泡排序

之前在b站看到有網友做常用排序演算法的視覺化,自己手癢也做了一下

1)演算法描述

氣泡排序(Bubble Sort),如其名,第一輪,從左往右,相鄰的兩個數依次比較,左邊比右邊大則交換位置,直到最後兩個數,這樣把最大的那個數放到了最後(升序,降序則相反)。重複上述步驟,經過n-1輪,陣列就從小到大排列好了。就像從氣泡從水底上升到水面,會漸漸變大(有時間試試模擬下);

2)程式碼實現及其視覺化

clear
%close all
list_1 =randperm(50); %測試資料,1-50不重複的隨機排列整數
%randperm(40)   [randperm(25),randperm(25)-26] 測試資料
N=length(list_1);    %陣列長度
stem(list_1,'^','r'); %畫原始資料的圖,或者用bar(),plot()都可以
pause  %暫停觀察影象及資料,(點選影象,然後按任意按鍵可繼續)

%主體程式
for nk=(N-1):-1:1
    
    for k=1:nk
        tem = list_1(k);  %第k個數
        if list_1(k)>list_1(k+1)
            list_1(k)=list_1(k+1);
            list_1(k+1)=tem;
        end
        %畫圖
        drawnow  %更新圖窗並處理任何掛起的回撥
        stem(list_1,'^','r');
        pause(0.05)   %暫停0.05秒,這裡有時候有可能使顯示效果變差,可不要
    end
    end
end 

1)測試資料 為randperm(50)時,1-50無重複的隨機整數陣列,gif效果圖如下

2) 測試資料為 [randperm(25),randperm(25)-26] 效果更明顯,更容易理解

(效果圖不代表實際執行速度)

3)製作gif格式圖片

可參考我之前gif如何製作的隨筆

所有程式碼如下

clear
% close all
list_1 =randperm(50); %測試資料,1-40不重複的隨機排列整數
N=length(list_1);    %陣列長度

len_fig=1;  %某一幀影象(資料)的下標
fig=figure;
stem(list_1,'^','r'); %畫原始資料的圖
Fra = getframe(fig);  %捕捉當前名為 fig 標識的視窗
img{len_fig}=frame2im(Fra); %返回與某一影片幀(圖片)關聯的影象資料
pause    %暫停觀察影象及資料,(點選影象,然後按任意按鍵可繼續

%主體程式
for nk=(N-1):-1:1
    
    better = 0; %設定一個優化條件
    for k=1:nk
        tem = list_1(k);
        if list_1(k)>list_1(k+1)
            list_1(k)=list_1(k+1);
            list_1(k+1)=tem;
            better =1;
        end
        
        drawnow
        stem(list_1,'^','r');
        
        % 儲存當前影象資料
        len_fig=len_fig+1;
        Fra = getframe(fig);
        img{len_fig}=frame2im(Fra);  %儲存當前影象資料
%         pause(.05);
    end
    if better==0  %如果better=0,說明這一輪沒有發生交換,順序是好的
        break;    %沒必要進行下一輪(但是根據觀察,只有一些順序性較好的或者資料量大時,優化程度才較大)
    end
end 

%利用儲存的資料製作gif圖並儲存
filename='mao_pao1.gif';  %儲存gif的檔名
for ii=1:len_fig
    [I_map,map] =rgb2ind(img{ii}, 256); %將資料轉為影象
    if ii ==1
        imwrite(I_map, map,filename,'gif','Loopcount',inf,'DelayTime',0.05)
    else
        imwrite(I_map, map,filename,'gif','WriteMode','append','DelayTime',0.05)
    end
end

4)冒泡演算法的一種優化及其簡單分析

冒泡演算法的時間複雜度是O(n2)

上組程式碼中,17行,23行,33-35行是冒泡演算法最常見的一種優化

   better = 0; %設定優化條件
   ''''''''
   better =1;
   ''''''''
   if better==0  %如果better=0,說明這一輪沒有發生交換,順序是好的
        break;    %沒必要進行下一輪(但是根據觀察,只有一些順序性較好的或者資料量大時,優化程度才較大)
   end
   ''''''''

但是這種優化,對於順序性差的且大量資料(比如最小的數位於最後一位時,仍然要經歷n(n-1)/2 次比較),效果一般。

而順序性好的資料(小的數集中於左邊,大的數集中於右邊),一般可遇不可求。(自己可以設計一個,但是沒什麼意義)