个人对数组排序(来自庞果网)的解法

自己做的数组排序问题,自己比较菜,以后还是要多多练习!请各位大神们多多指教,小弟感激不尽!


题目:

给定一个包含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。


思路:

我的想法是,首先复制测试数组a的所有元素到b,然后对数组b进行排序(这里用的最简单的冒泡。。),然后从a的第一个元素开始,检测它是不是这个数组的最小的,如果是则不用交换,下一个;如果不是,再从数组的尾端向前找数组最小的元素,找到后两者进行交换(这样可以确保最终交换的次数是最少的,因为你要考虑数组中有可能有多个相同的最小元素),然后对下一个元素进行检测,此时最小元素是除了第一个元素的其余元素中的最小(也就是第二小),然后依次到数组的第n-1个元素为止,算法结束。

算法复杂度分析:主要是排序操作和交换操作,这两个都是n2,所以T(n)=O(n2). (应该还能够改进的)


程序:

public class numofSwap {

    public static void main(String args[]) 
    { 
    	
    	int []Array={1,3,4,2,2,3,1};
    	System.out.println("需要交换的次数为:"+run(Array));    	
    } 
    
    public static int  run(int []a) {
 	  int n,i,j,t,count=0;
 	  n=a.length-1;
 	  int []min=new int[n+1];
 	  for(i=0;i<=n;i++){
 		  min[i]=a[i];
 	  }  
 	  //排序
 	  for(j=n;j>0;j--){
 		 for(i=j-1;i>=0;i--){
 			 if(min[i]>min[j]){
 				 t=min[j];
 				 min[j]=min[i];
 				 min[i]=t;
 			 }
 		 }
 	  }
 	  
 	  for(i=0;i<n;i++){
 		  if(a[i]!=min[i]){
 			  for(j=n;j>i;j--){
 				  if(a[j]==min[i]){
 					 t=a[j];
 	 				 a[j]=a[i];
 	 				 a[i]=t;
 					 count++;
 					break; //交换后跳出内层循环
 				  }
 			  }
 		  }
 	  }
 	  return count;
 	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值