前言
visuAlgo是个算法相关的网站,里面有很多算法的演示动画,可以方便理解算法的流程,下面看看经典的排序算法。本文用mathematica(索引从1开始)代码来演示这些算法。
冒泡
每次在未排序部分中比较相邻两个元素,并把较大的元素放在右边,一趟循环过后,最大的元素放在最右边;所有循环结束后,所有的元素都已经排序。
ClearAll[bubble];
bubble[list_Symbol] := Module[
{i, j, temp},
For[i = Length[list], i >= 2, i--,
For[j = 1, j < i, j++,
If[list[[j]] > list[[j + 1]],
temp = list[[j]];
list[[j]] = list[[j + 1]];
list[[j + 1]] = temp;
]
];
Print[list];
];
list
];
SetAttributes[bubble, HoldAll];
其中,i表示未排序部分的最大索引,最小值是2,最大值是整个列表的最后一个索引;j表示未排序部分中除最后一个索引的其余索引,最小值是1,最大值是i-1;temp表示临时赋值变量,用于交换相邻两个数据。
选择
每趟循环,找出未排序部分的最小值的索引,并把最小值和未排序部分的第一个值交换位置;所有循环结束后,所有的元素都排序。
ClearAll[select];
select[list_Symbol] := Module[
{i, j, minIndex, temp},
For[i = 1, i < Length[list], i++,
minIndex = i;
For[j = i + 1, j <= Length[list], j++,
If[list[[j]] < list[[minIndex]], minIndex = j]
];
temp = list[[i]];
list[[i]] = list[[minIndex]];
list[[minIndex]] = temp;
Print[list];
];
list
];
SetAttributes[select, HoldAll];
其中,i表示未排序部分的第一个索引,最小值是整个列表第一个索引,最大值是整个列表倒数第二个索引;j表示未排序部分中除第一个索引以外的其余索引,最小值是i+1,最大值是整个列表的最后一个索引;minIndex表示每次循环未排序部分的最小值索引;temp是临时变量,用于交换未排序部分第一个值和最小值。
插入
每趟循环从未排序部分中取出第一个,从后往前逐一与排序部分的元素比较,如果比前面的元素小,就和这个较小的元素交换位置,直到没有比它小的元素为止。
ClearAll[insert];
insert[list_Symbol] := Module[
{i, j, temp},
For[i = 2, i <= Length[list], i++,
For[j = i - 1, j >= 1, j--,
If[list[[j + 1]] < list[[j]],
temp = list[[j + 1]];
list[[j + 1]] = list[[j]];
list[[j]] = temp;
];
];
Print[list];
];
list
];
SetAttributes[insert, HoldAll];
其中,i代表未排序部分的索引,最小值是2,最大值是len;j代表已排序部分索引,最大值是i-1,最小值是1;temp是中间变量,用于交换数据。
本文介绍了冒泡排序、选择排序和插入排序三种经典排序算法。通过Mathematica代码演示了每种算法的工作原理:冒泡排序通过不断比较相邻元素并交换位置实现排序;选择排序在未排序部分找到最小值并将其移至起始位置;插入排序则将未排序部分的元素逐个插入到已排序部分。
956

被折叠的 条评论
为什么被折叠?



