排序算法可以说是每个程序员都必须得掌握的了,相信很多读者都知道并且掌握,在此篇文章中我就列举三种排序(插入、冒泡、希尔),就得有帮助的话,也可评论,我会出其他的排序算法。
在学习之前可能有些人不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下:
1、稳定排序:如果 a 原本在 b 的前面,且 a b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2、非稳定排序:如果 a 原本在 b 的前面,且 a b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
4、非原地排序:需要利用额外的数组来辅助排序。
5、时间复杂度:一个算法执行所消耗的时间。
6、空间复杂度:运行完一个算法所需的内存大小。
插入排序
插入排序是一种简单的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
function A = insertionSort()
% 插入排序算法
% 自动生成随机数组并排序
n = 10; % 数组大小
A = randi(100, 1, n); % 生成一个1到100的随机整数数组
disp('原始数组:');
disp(A);
for i = 2:n
key = A(i);
j = i - 1;
while j > 0 && A(j) > key
A(j + 1) = A(j);
j = j - 1;
end
A(j + 1) = key;
end
disp('排序后的数组:');
disp(A);
end
冒泡排序
该算法重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
function A = bubbleSort()
% 冒泡排序算法
% 自动生成随机数组并排序
n = 10; % 数组大小
A = randi(100, 1, n); % 生成一个1到100的随机整数数组
disp('原始数组:');
disp(A);
for i = 1:n-1
for j = 1:n-i
if A(j) > A(j + 1)
temp = A(j);
A(j) = A(j + 1);
A(j + 1) = temp;
end
end
end
disp('排序后的数组:');
disp(A);
end
希尔排序
希尔排序是基于插入排序的一种算法,它允许交换距离较远的元素,从而对远距离的元素进行排序。随着算法的进展,使用的距离会逐步减小,直到仅比较相邻元素的距离,这个阶段就是简单的插入排序。
function A = shellSort()
% 希尔排序算法
% 自动生成随机数组并排序
n = 10; % 数组大小
A = randi(100, 1, n); % 生成一个1到100的随机整数数组
disp('原始数组:');
disp(A);
gap = floor(n / 2);
while gap > 0
for i = gap+1:n
temp = A(i);
j = i;
while j > gap && A(j - gap) > temp
A(j) = A(j - gap);
j = j - gap;
end
A(j) = temp;
end
gap = floor(gap / 2);
end
disp('排序后的数组:');
disp(A);
end