编程之美书中讲的一摞烙饼的排序一题
这里无法用基本的排序方法对其排序,那么最直接的方法是找出N个数种最大者,将这通过两次翻转放置到最底部,然后处理N-1,N-2等,直到全部排序完,所以一共需要交换2(N-1)次
void reverse(int cakes[], int beg, int end)
{
int temp;
while(beg < end){
temp = cakes[beg];
cakes[beg++] = cakes[end];
cakes[end--] = temp;
}
}
void cake_sort(int cakes[], int n)
{
int ith, max_idx, cur_max, idx;
for(ith=n-1; ith>=1; --ith)
{
cur_max = cakes[0];
max_idx = 0;
//目的找到目前最大的那个饼
for(idx=1; idx<=ith; ++idx)
{
if(cakes[idx] > cur_max){
cur_max = cakes[idx];
max_idx = idx;
}
}
if(max_idx != ith){
reverse(cakes, 0, max_idx);
reverse(cakes, 0, ith);
}
}
}

本文介绍了一种特殊的排序问题——烙饼排序。该问题要求通过一系列翻转操作将一组乱序的“烙饼”按大小顺序排列。文章提供了一个具体的实现方案,并详细解释了如何寻找当前未就位的最大元素并通过两次翻转将其正确放置。

被折叠的 条评论
为什么被折叠?



