visuAlgo-排序算法

前言

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-1temp表示临时赋值变量,用于交换相邻两个数据。

选择

每趟循环,找出未排序部分最小值的索引,并把最小值未排序部分第一个值交换位置;所有循环结束后,所有的元素都排序。

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,最大值是lenj代表已排序部分索引,最大值是i-1,最小值是1temp是中间变量,用于交换数据。

归并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值