排序演算法在matlab中的視覺化 (三)
阿新 • • 發佈:2022-03-03
排序演算法在matlab中的視覺化 (三)
選擇排序
1)演算法描述
序列 a[0],a[1],a[2]...a[n],對它進行排序。先從0這個位置到n這個位置找出最小值,
然後將這個最小值與a[0]交換,然後,剩下的a[1]到a[n]就是接下來要排序的序列
可以從1這個位置到n這個位置找出最小值,然後將這個最小值與a[1]交換,
之後,剩下a[2]到a[n]就是接下來要排序的序列
每一次,都從序列中找出一個最小值,然後把它與剩下序列的第一個元素交換位置,
這樣下去,待排序的元素就會越來越少,直到最後一個
關鍵點:每次迴圈要找出最小值及其下標
這件事,matalb的內建函式min()可以做到;其他語言也有的內建函式/庫函式可以做類似的事情。當然,自己寫也容易寫出來。
2)程式碼以及視覺化
clear,close all list_1 =[5,5,5,5 , randperm(51)-26 , -5,-5,-5,-5];%測試資料 N=length(list_1); %使用了內建函式 min(),很方便 % for k =1:N-1 % [tem_min, tem_position]=min(list_1(k:end)); % tem =list_1(k); % list_1(k) =tem_min; % list_1(tem_position+k-1)=tem; % % pause(.1) % stem(list_1) % end bar(list_1); tm='該輪最小值'; tem_posit=0; %初始最小值的下標,當然0下標在matlab是沒有的 for ii=1:N-1 t=0; %設定一個判斷條件 %找出最小值及其位置,相當於 min()函式 my_min=list_1(ii);%設某一輪的第一個數為最小值 for k=ii:N-1 if my_min>list_1(k+1) my_min = list_1(k+1); %新的最小值 tem_posit =k+1; %最小值位置 t=1; %如果最小值更新,設定為1 end end %交換位置,只有t=1時候才可以交換,t=0,說明list_1(ii)恰好在適當的位置 if t==1 tem = list_1(ii); list_1(ii) = my_min; list_1(tem_posit)=tem; end drawnow pause(.3)%暫停0.3秒 ,如果測試資料量大,不用也行 bar(list_1,'r') my_title=strcat(tm,num2str(my_min)); title(my_title); end
3)gif的製作程式碼
clear,close all list_1 =[5,5,5,5,randperm(51)-26,-5,-5,-5,-5]; N=length(list_1); hf=figure; len_hf=1; bar(list_1); now_hf=getframe(hf); data_hf{len_hf}=frame2im(now_hf); tm='該輪最小值'; tem_posit=0; %初始最小值的下標,當然0下標在matlab是沒有的 for ii=1:N-1 t=0; %設定一個判斷條件 %找出最小值及其位置,相當於 min()函式 my_min=list_1(ii);%設某一輪的第一個數為最小值 for k=ii:N-1 if my_min>list_1(k+1) my_min = list_1(k+1); %新的最小值 tem_posit =k+1; %最小值位置 t=1; %如果最小值更新,設定為1 end end %交換位置,只有t=1時候才可以交換,t=0,說明list_1(ii)恰好在適當的位置 if t==1 tem = list_1(ii); list_1(ii) = my_min; list_1(tem_posit)=tem; end %顏色 len_hf=len_hf+1; if mod(len_hf,2)==0 color_hf='w'; else color_hf='k'; end drawnow pause(.3)%暫停0.3秒 bar(list_1,color_hf) my_title=strcat(tm,num2str(my_min)); title(my_title); %儲存影象資料 now_hf = getframe(hf); data_hf{len_hf} = frame2im(now_hf); end %利用儲存的資料製圖 filename='choice_sort3.gif'; for ii=1:len_hf [I_map,map] =rgb2ind(data_hf{ii}, 256); %將資料轉為影象 if ii ==1 imwrite(I_map, map,filename,'gif','Loopcount',inf,'DelayTime',0.5) else imwrite(I_map, map,filename,'gif','WriteMode','append','DelayTime',0.5) end end
閃瞎我狗眼的圖:
4) 簡單分析
選擇排序的時間複雜度與氣泡排序、插入排序一樣,都是O(n2)
但是選擇排序中,陣列(序列)資料間交換的次數只有n-1次(最多)