matlab ——快速排序演算法視覺化
阿新 • • 發佈:2022-03-11
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);