数组排序 --- 庞果

题目说明


本题来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”内),以下是题目详情:

给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。

求最少需要多少次交换,能把数组排成按1-n递增的顺序,其中,数组长度不超过100。

例如:

  • 原数组是3,2,1, 我们只需要交换1和3就行了,交换次数为1,所以输出1。
  • 原数组是2,3,1,我们需要交换2和1,变成1,3,2,再交换3和2,变为1,2,3,总共需要的交换次数为2,所以输出2。

函数头部: C/C++ int run(const int *a,int n);

算法描述


实际上,这个题目是一个N个连续数的排序,题目中有个条件需要注意一下,比如四个数,肯定是1,2,3,4这四个,不会是1,3,4,5,所以是连续数的排序,要做到交换次数最少,需要做到的只有一点: 每次交换后,交换的数中至少有一个数不需要在动了,也就是每次交换都要有直接的效果, 为了满足这个条件,我们可以这么来交换:

  • 先把“1”交换到位置“1”上
  • 然后依次把各个数交换到他们自己的位置上
  • 位置上正好是这个数的不需要交换

满足上面三点要求并进行交换就行了。

代码很简单,也没做什么优化,都传到github上了。

int run(const int *a,int n)
{
	int *b=(int *)malloc(sizeof(int)*n);
	int count=0;
	int temp;
	for(int i=0;i<n;i++)
		b[i]=a[i];
	
	
	for(int i=0;i<n;i++)
	{
		for(int k=i;k<n;k++)
		{
			if(b[k]==i+1 && k!=i)
			{
				count++;
				temp=b[k];
				b[k]=b[i];
				b[i]=temp;
			}
		}
	}
	
	return count;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值