给定一组不同的未排序整数s1,s2,..,sn,您如何排列整数以使s1 s3 <s4 …
我知道这可以通过从左到右查看数组来解决,如果不满足条件,交换这两个元素将给出正确的答案。有人可以解释一下为什么该算法有效。
给定数组中的任何三个连续数字,存在四种可能的关系:
a < b < c a < b > c a > b < c a > b > c
在第一种情况下,我们知道a <c。由于满足第一个条件,我们可以交换b和c来满足第二个条件,而第一个条件仍然满足。
在第二种情况下,两个条件都已满足。
在第三种情况下,我们必须交换a和b来赋予b <a?C。但是我们已经知道b <c,所以如果a <c然后交换满足第二个条件不会使第一个条件无效。
在最后一种情况下,我们知道a> c,因此交换a和b来满足第一个条件将保持第二个条件的有效性。
现在,您将第四个数字添加到序列中。你有:
a < b > c ? d
如果c c和c> d,那么我们知道b> d。因此,将c和d交换可以得到b> d <c。
添加第五个数字时,可以使用类似的推理。你有a < b > c < d ? e。如果d> e,则无需更改任何内容。如果d <e,则根据定义c <e也是如此,因此交换将保留先前条件。
a < b > c < d ? e
实现该算法的伪代码:
for i = 0 to n-2 if i is even if (a[i] > a[i+1]) swap(a[i], a[i+1]) end if else if (a[i] < a[i+1]) swap(a[i], a[i+1]) end