排序演算法在matlab中的視覺化(一)
阿新 • • 發佈:2022-03-03
排序演算法在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 次比較),效果一般。
而順序性好的資料(小的數集中於左邊,大的數集中於右邊),一般可遇不可求。(自己可以設計一個,但是沒什麼意義)