matlab 希尔算法可视化

Posted yangyiqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 希尔算法可视化相关的知识,希望对你有一定的参考价值。

matlab 希尔算法可视化

调用函数

主体:

%希尔排序,又称缩小增量排序,是对插入算法的改进
%调用插入排序选择函数版本
%1.分组,相隔 floor(N/2 )整数为一组
clear
list_1=[randperm(20),randperm(20)-21,2,2,20,20];
% [randperm(23),0,-5,4,4,4,30]     测试数据
N=length(list_1);
n=floor(N/2);

num_exchange=0;%交换次数

% stem(list_1)
while n>0
    kk =1;% k=1为每组数第一个数的下标  
    while kk<=n
        %调用插入排序函数
    [list_1(kk:n:N),num_exchange]=my_charu_func(list_1(kk:n:N),num_exchange);
    kk=kk+1;
    end
    
    n=floor(n/2);
    drawnow
   pause(.3)
    stem(list_1)
end

my_charu_func函数(插入算法)

%插入排序函数
%主要是为了在希尔排序上使用
function [list_1,num_exchange]=my_charu_func(list_1,num_exchange)
% num_exchange,交换次数,如果只输入数组,默认为0
if nargin==1
    num_exchange=0;
end
    
N=length(list_1);
for ii=2:N
    %从第二元素开始,分别按顺序与前一位元素比较 
    
    for k=(ii-1):-1:1 %从后往前,(这段可以用while)
        %如果小于,则交换位置
        if list_1(k+1)<list_1(k)
            tem=list_1(k+1);
            list_1(k+1)=list_1(k);
            list_1(k)=tem;
            num_exchange= num_exchange+1;%如果交换了位置,+1,为观察时间复杂度设置
%         else
%             break   %如果大于,说明顺序是恰好排好的,没必要继续比较下去
        end
    end
end

不调用函数版本

%希尔排序2,不调用函数版本
clear
list_1=randperm(40);

% x=-20:20;
x=linspace(0,2*pi,40); %画点好玩的
list_1=x(list_1);%将x随机排列,并赋值给list_1
axis equal
% plot(cos(x),sin(list_1))
% title(\'画个圆\');
%[0,2,-3,randperm(40),45,45,39]
N=length(list_1);
n = floor(N/2);
nn=0;  % 交换位置次数
while n>0
    %ii 分组后每组数组的第一个数的坐标
    for ii =1:n
        
        for jj=ii+n:n:N
            
            if list_1(jj)<list_1(jj-n)%如果小于
                tem=list_1(jj);
                kk=jj-n; %要比较下一个数坐标
                while kk>=1 && list_1(kk)>tem
                    list_1(kk+n)=list_1(kk);
                    kk=kk-n;
                    nn=nn+1;
                end      
                list_1(kk+n)=tem;
                
                 drawnow
                 pause(.1)
                 subplot(2,1,1);
                 
                 %  plot(x,list_1)
                 bar(list_1)
                 subplot(2,1,2);
                 
                 plot(cos(x),sin(list_1));
                 title(\'画个圆\');
%                 subplot(2,1,1);
%                 plot(x,list_1);
%                 subplot(2,1,2)
%                 bar(list_1)
            end
        end  
    end
    n=floor(n/2);
end
% list_1

以上是关于matlab 希尔算法可视化的主要内容,如果未能解决你的问题,请参考以下文章

可视化希尔排序算法

学习数据结构笔记====>不同的排序算法(Sort Algorithm)[冒泡,选择,插入,快速,希尔,基数,归并]

算法系列二希尔排序

matlab-归拼排序算法可视化

matlab ——快速排序算法可视化

MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”含matlab源代码