选择排序动画演示

每趟从剩下里面挑最小的放到前面,交换次数最少。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

选择排序把数组切成两截:左边已经排好,右边还没碰过。每一趟只在右边扫一遍挑出最小的那个,跟右边界那一格换一次位置,左边的边界就朝右推进一格。这一页把 i 和 min 两个指针分开标出来,你能看清「一路比大小」和「最后才动手」是两件事。

它的招牌是交换次数:n 个元素最多换 n−1 次,一趟到底也只换一次,这一点比冒泡省太多了——冒泡一趟能换个几十次。代价是稳不住:a[i] 跟远处的最小值一换,中间那些相等的关键字前后就调了个。它也没有提前退出的余地,正序数据照样比满 n(n−1)/2 次。

选择排序演示怎么用

  • 认指针:标注 i 是这一趟要填的位置,min 是当前挑到的最小值所在;两者重合时写成 i/min,表示还没开始比。
  • 数交换:计数条上「交换」那一栏到结束都不会超过 n−1,切到「正序」档位可以看到它干脆是 0。
  • 对形态:规模给 4~16,五档形态加上自定义的一串数字;把「正序」和「倒序」连着跑一遍,比较次数一模一样,这是它跟冒泡较不一样的地方。
  • 看稳定性:切「多重复」那档,盯着两个相同的数:一趟远距离交换就能把它们前后颠倒,这就是它不稳定的现场。

常见问题

既然都是 O(n²),为什么还要跟冒泡分开讲?

两者关注的成本不一样。冒泡的开销压在交换上,一次交换是三次写;选择排序把交换次数摁到 n−1 以内,比较虽然一样多但只是读。写在慢介质上比读贵的时候,选它就划算。

选择排序为什么不稳定?能改成稳定的吗?

不稳定来自那次远距离交换:把后面的最小值直接搬到前面,跨过了一串相等的元素。想保住次序就别换,改成把最小值逐个往前「插」,代价是每趟要动 O(n) 次写,招牌也就没了。

它有没有办法像冒泡那样提前结束?

没有现成的标志位。某趟没发生交换并不意味着剩下的已经有序——最小值本来就在开头,只说明这一格不用动。真要提前收,得额外维护信息,那份开销比省下来的多。

演示编号 A02无需安装,手机端同样可用按 Ctrl + K 搜工具与演示

顺手能用上的工具