今天看Robert Sedgewick写的《算法》,习题中有一个出列排序问题,觉得有点意思。
题目大概意思就是一副牌,只能交换牌最上两张,或者将最后一张牌放入这叠牌的最底下。怎样才能将这副牌进行排序?
我的解法思路如下:
第一步:比较第一张牌与第二张牌,若第一张牌比第二张牌大,就交换这两张牌,否者保持不变。然后将第一张牌放入牌底,经过length-1次这样的操作以后,第一张牌肯定就是最大的那张。接着不要做任何比较,直接把顶上的一张牌放入牌底。
第二步:第一步中已经找出了最大的一张牌,并且该牌在牌底最后一张。我们接着重复第一步,比较两张牌的步骤,经过length-2次这样的操作后,顶上的牌就变成了除了最大的那张牌以外最大的。由于经过了length-2次牌顶移动到牌底,最大的那张牌刚好移动到了第二张。所以接着把顶上的两张牌,再依次放入牌底。
后面的步骤与上面相似。。。。
代码如下:
void MoveQueue(int *a, int l, int times)//将首元素移动到队尾
{
for (int i = 0; i < times; ++i)
{
int temp = a[0];
for (int j = 0; j < l - 1; ++j)
a[j] = a[j + 1];
a[l - 1] = temp;
}
}
void DequeueSort(int *a, int l)
{
for (int i = 1; i < l ; ++i)//执行l-1次冒泡
{
for (int j = 0; j < l-i; ++j)
{
if (a[0] > a[1]) swap(&a[0], &a[1]);
MoveQueue(a, l, 1);
}
MoveQueue(a, l, i);
}
}