题目: 现有一个n个整数的序列,你要做的就是交换两个数的位置直到整个序列按照升序排列,那么将这个整数序列排好序,需要交换多少次?例如,1,2,3,5,4,我们只需要交换一次,即将5和4交换即可。
这种类型的题目是冒泡排序的变形题
方法一:
冒泡排序:上来就给他整2个for循环
//记录循环化次数
private int count = 0;
public int sort1(int[] a) {
//用来换位的
int temp = 0;
for(int i = 0;i<a.length-1;i++) {
//控制外循环
for(int j = 0;j<a.length-1;j++) {
//控制内循环
//换位
if(a[j+1]<a[j]) {
temp =a[j];
a[j]=a[j+1];
a[j+1]=temp;
count++;
}
}
}
return count;
}
运行结果:
方法二:
我们还可以使用递归的方式:
private int count = 0;
public int sort2(int[] a) {
int i = 0;
while(i<a.length-1) {
//找出一个比自己下一个小的数
if(a[i]>a[i+1]) {
//用异或进行换位
a[i]=a[i]^a[i+1];
a[i+1]=a[i]^a[i+1];
a[i]=a[i]^a[i+1];
//调用自身
sort1(a);
count++;
}
i++;
}
return count;
}
结果:
主程序main方法:
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入整数的个数:");
int n = sc.nextInt();
//生成相应大小的数组
int[] a =new int[n];
System.out.println("请输入相应个数的整数:(分别用','隔开)");
String str = sc.next();
//将字符串切分成字符串数组
String[] strArr = str.split(",");
for (int i = 0; i < strArr.length; i++) {
//与数组a一一对应赋值,需要进行类型转换
a[i]=Integer.valueOf(strArr[i]);
}
//打印转换前的数组
System.out.println(Arrays.toString(a));
CowCoder01 cowCoder01 = new CowCoder01();
//进行转换
System.out.println("转换次数:"+cowCoder01.sort2(a));
//打印转换后的数组
System.out.println(Arrays.toString(a));
}
PS:
转换两个变量的值的方法:
1.中间变量法
//设一个中间变量
int temp;
temp=a;
a=b;
b=temp;
System.out.println("a= "+a+" b= "+b);
2.加减法
a=a+b;
b=a-b;
a=a-b;
System.out.println("a="+a+" b="+b);
3.异或法。这个方法比较偏,但是如果面试写出来很装x哦!
a=a^b;
b=a^b;
a=a^b;
System.out.println("a="+a+" b="+b);
结果: