Start at the leftmost digit
While current digit is valued the lowest (non-zero for the first digits equal
to the number of zeroes in the set) of the remaining set of numbers, advance
to the next number
Swap current value with lowest remaining value.
您可以保留数组的排序副本,以帮助您进行决策。您需要它来了解您当前的最低数字有多少。如果您也存储它们的索引,则可以使其更加高效。
没有必要拥有任何额外的存储空间,但它可能会使事情变得更快。在第一个数组的单次传递中,您可以获得 0 的数量以及下一个最小数字的索引,但是在像 1、0、6、9、7 这样的数组中,您必须通过阵列4个不同的时间。
编辑 - 稍微更多的冲洗算法
Copy the array into a separate one, called c, and sort c. (You'll use this to make your decision faster, though you could simply repeatedly analyze the array.)
if c has zeros, find the value of its first non-zero value, called x
if a[0] != x, swap a[0] with x.
set index to 1
while a[index] == c[index], ++index
swap a[index] with c[index]
如果你这样做,它会花费你另一个数组,但是通过一次排序和一次通过数组来完成。
如果您不这样做,则每次都必须通过数组的其余部分才能找到最小值。我不擅长复杂性,但我相信这是 n log n,因为每次迭代都会从更高的索引开始。
如果不使用数组,您必须执行类似的操作
Find the lowest non-zero value
if a[0] isn't this value, swap with this value
index = 1
find lowest value starting at a[index]
if they're not equal, swap the values, done. Otherwise, increment index
那仍然是 n log n。我认为排序可以提高效率。