zoukankan      html  css  js  c++  java
  • 数组排序 --- 庞果

    题目说明


    本题来自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;
    }



  • 相关阅读:
    java常见面试题汇总(三)
    Java学习流程图(学习路线、书籍、教程推荐)
    java开发面试题:spring面试题总结
    2014.11.12模拟赛【最大公因数】
    2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
    vijos1781 同余方程
    vijos1777 引水入城
    2014.10.31我出的模拟赛【天神下凡】
    voijs1883 月光的魔法
    2014.10.31我出的模拟赛【藏宝图】
  • 原文地址:https://www.cnblogs.com/james1207/p/3301666.html
Copyright © 2011-2022 走看看