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 希尔算法可视化的主要内容,如果未能解决你的问题,请参考以下文章