编程之美-1.3-烙饼排序问题

本文探讨了烙饼排序问题,这是一种特殊的排序算法,通过有限次翻转操作对数组进行排序。文章分析了算法的递归流程,强调了搜索上界和下界对提高效率的重要性,并指出最小翻转解的非唯一性。示例展示了如何对给定数组应用烙饼排序,并给出了多个有效最优解及其对应的翻转次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
烙饼问题可以简化为对一段由n个无重复的整数组成的无序数组a[n]进行排序。排序要求每次只能对a[0]~a[i]部分的数组进行翻转(0 < i < n),最终完成排序。
输入:数组大小n;n个整数。
输出:最小递归查找次数m;每次翻转位置j0j1…jm-1

问题思考:
烙饼排序这部分,主要考量的是对递归函数的使用。
而搜索上界与搜索下界则可以一定程度上提高代码的运行效率,减少搜索次数。
递归流程如下:
①首先进行0~i的翻转
②记录第step步翻转位置i
③然后进行下一层翻转
④调用递归返回之后,再进行一次0~i的翻转,保持数组进入本次循环时的顺序
①i++,进行0~i+1的翻转

for (int i = 1; i < m_nCakeCnt; i++)
{
   
   
	Revert(0, i);
	m_ReverseCakeArraySwap[step] = i;
	Search(step + 1);
	Revert(0, i);
}

稍微修改代码之后可以发现,最小翻转的解并不是唯一的。
测试输入:10,{ 5, 9, 4, 1, 2, 0, 8, 7, 6, 3 }
输出有效最优解:
14849278
15183931
15218393
15839312
19385312
19465853
19484278
19615285
|Search Times| : 159193
Total Swap times = 8

完整代码如下:

#include <stdio.h>
#include "stdafx.h"
#include "afx.h"

class CPrefixsorting
{
   
   
public:

	CPrefixsorting()
	{
   
   
		m_nCakeCnt = 0;
		m_nMaxSwap = 0;
	}

	void Run(int* pCakeArray, int nCakeCnt)
	{
   
   
		Init(pCakeArray, nCakeCnt);

		m_nSearch = 0;
		Search(0);
	}

	//输出烙饼具体翻转的次数
	void Output()
	{
   
   
		for (int i = 0; i < m_nCakeCnt; i++)
		{
   
   
			printf("%d", m_ReverseCakeArray[i]);
		}
		printf("\n");
		for (int i = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值