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

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

排序演算法在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次(最多)