С иллюстрациями. Иллюстрации "моргают".
Сортировка вставками
N = 100;
a = round(100*rand(1,N));
h = plot(a,'.');
for i = 2:N % i - номер прохода
x = a(i);
% поиск места элемента в готовой последовательности
j = i-1;
while (j >= 1) & (a(j) > x)
a(j+1) = a(j); % сдвигаем элемент направо, пока не дошли
j = j-1;
end
% место найдено, вставить элемент
a(j+1) = x;
set(h,'YData',a);
pause(0.25);
drawnow;
end
Сортировка методом "пузырька"
N = 10000;
a = round(N*rand(1,N));
h = plot(a,'.');
tic;
for i = 2:N % (i-1) - номер прохода
for j = N:-1:i % внутренний цикл прохода
if a(j-1) > a(j)
x=a(j-1); a(j-1)=a(j); a(j)=x;
end
end
set(h,'YData',a);
% pause(0.25);
drawnow;
end
time = toc;
text(0.1*N,N-0.1*N,['Vremya sortirovki = ' num2str(time)])
Сортировка выбором
N = 100;
a = round(100*rand(1,N));
h = plot(a,'.');
for i = 1:N % i - номер шага
k = i; x = a(i); % k - индекс наименьшего элемента
for j = i+1:N % цикл выбора наименьшего элемента
if a(j) < x
k=j; x=a(j);
end
end
a(k) = a(i); a(i) = x;
set(h,'YData',a);
pause(0.25);
drawnow;
end
Быстрая сортировка
"Вызывалка"
N = 500;
a = round(N*rand(1,N));
tic;
a = dqsort(a,1,N);
time = toc;
text(0.1*N,N-0.1*N,['Vremya sortirovki = ' num2str(time)])
и сама функция
function a = dqsort(a,left,right)
h = plot(a,'.');
i = left; j = right; % поставить указатели на исходные места
p = a(round((left+right)/2)); % центральный элемент
% процедура разделения
while i <= j
while ( a(i) < p )
i = i+1;
end
while ( a(j) > p )
j = j-1;
end
if i <= j
temp = a(i); a(i) = a(j); a(j) = temp;
i=i+1; j=j-1;
end
end
set(h,'YData',a);
pause(0.25)
drawnow;
% рекурсивные вызовы, если есть, что сортировать
if j > left
a = dqsort(a, left, j);
end
if i < right
a = dqsort(a, i,right);
end
Комментарии
comments powered by Disqus