自己做的数组排序问题,自己比较菜,以后还是要多多练习!请各位大神们多多指教,小弟感激不尽!
题目:
给定一个包含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;
}
}