java这个冒泡排序是怎么回事? java冒泡排序代码
“JAVA写冒泡排序”是什么意思?
按冒泡排序思想,有8颗豆子(大小不一)放在8袋子里,从第1个袋了拿出豆子,与第2个袋子里的豆子相比较,如果第2个袋子里豆子比第1个袋子的豆子大,就把第2个袋子里的豆子放入第1个袋子,把第1个袋子的豆子放入第2个袋子。然后,第1个袋子继续和第3个袋子比较。如果第2袋子的豆子不会比第1个袋子的大,就和第3个袋子比较,这样一一个下直到和所有的袋子比较过。之后第2个袋子也与第2个袋子以后的相比较过.......!
另外还要用到交换的方法:
代码主要是用循环嵌套:
public class NewMain {
public static void main(String[] args) {
// TODO code application logic here
int a[]={1,5,8,11,16,30,40,50,199};//定义一个数组,也可写成 int[] a={1,5,8,11,16,30,40,50,199};
int c;//用于交换用的
for(int i=0;i
for(int j=i+1;j
if(a[j]>a[i]){ // 进行交换
c=a[j];
a[j]=a[i];
a[i]=c;
}
}
System.out.println(a[i]);
}
}
java 的冒泡排序每一步的含义
int[] arr = new int[200000];//创建一个长度为200000的一维整型数组arr,下标从0开始,第一个元素是arr[0],最后一个元素是arr[199999];
for(int i=0 ; i<arr.length ; i++){//for循环,i从0开始,每次循环i加1,直到i不小于arr的长度即200000时退出循环
arr[i] = (int) (Math.random()*1000000);//给arr的第i个元素随机赋一个从0到999999的整数值
long p = 0 ;//定义一个长整型p=0
long q = 0 ;//定义一个长整型q=0
long L1 = System.currentTimeMillis();//获取系统当前时间(单位:毫秒),并赋值给长整型L1
for (int n = 1; n < arr.length; n++) {//外层for循环,n从1开始,每次循环n加1,直到n不小于arr的长度即200000时退出循环
for (int i = arr.length - 1; i >= n; i--) {//内层for循环,i从arr的长度减1即199999,每次循环i减1,直到i小于n即外层循环中n的值时,退出循环
p++;//p自增等价于p=p+1
if (arr[i - 1] > arr[i]) {//判断arr第i-1个元素是否大于第i个元素
q++;//q自增等价于q=q+1
arr[i - 1] = arr[i] + (arr[i] = arr[i - 1]) * 0;//此时arr[i - 1]大于arr[i],交换两者的位置,即交换arr[i - 1]和arr[i]的值(由此可见做的是升序排序)。这个表达式可以转换成
int temp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = temp;
最难理解的也就是arr[i] + (arr[i] = arr[i - 1]) * 0,如果能理解y= x + (++x);就应该好理解这个了
java冒泡排序
其实3楼的回答已经说到重点了,但问题不在于你的if条件里
你这个题的错误在于你排序的内层循环的终止条件有问题
不应该是j<a.length因为这个会得到你数组的长度,而你内层循环做的是对每次比较进行循环,也就是说外层循环是控制一共几个数参与冒泡,而内层则是控制每个数字要跟其他的几个去比较,就好比5个人比身高其中一个要跟几个比?是不是4个呢,他不用跟自己比,因此这个语句需要写成j<a.length-1,那这个时候已经可以正常执行了,但是还不是最好的答案,因为大家都知道冒泡排序是从底下开始将要排序的数据一个个的弄到最上面,那这个过程中外循环执行一次,就会有一个数据在内层循环的工作下,经过比对成功的到顶,那这个数据已经和所有的数据进行过比对了,他已经是最大或者最小的了,后后面的数据再进行比较的时候已经没必要再去跟它比较了,再比虽然不会错,但是会额外的消耗一些性能做一些没意义的事情了。解决方案是修改内循环的结束条件为j<a.length-1-i
为什么减i呢,i是控制每个数字去循环比对的循环中的变量,每比出来一个,它会自加一次,也就是说i是几就代表已经排好几个了,这已经排好的几个,我们已经不需要再去做比较了,因此我们将它们减掉。
另外现在在JAVA里面已经不需要自己手写冒泡排序了,使用util包的Arrays类的sort方法就可以进行排序了,不过还是很认同你的学习精神的,毕竟冒泡排序在其他的语言中还是有用的呵呵。
java冒泡排序法
public class SortTest {
public void sort(int[] args){
for(int m : args){
System.out.print("排序前 "+args[m]+" ");
}
int time1 = 0,time2 = 0;
for(int i = 0 ; i < args.length-1 ; i++){
++time1;
for(int j = i+1 ; j < args.length ; j++){
++time2;
int temp ;
if(args[i] > args[j]){
temp = args[j];
args[j] = args[i];
args[i] = temp;
}
}
}
System.out.println();
System.out.println("外循环次数:"+time1+"内循环次数:"+time2);
for(int n : args){
System.out.print("排序后 "+n+" ");
}
}
public static void main(String[] args) {
int[] arg = new int[]{2,1,4,5,8,7,6,3,9,0};
new SortTest().sort(arg);
}
}
降序排列 循环次数最少
输出结果为:
排序前 4 排序前 1 排序前 8 排序前 7 排序前 9 排序前 3 排序前 6 排序前 5 排序前 0 排序前 2
外循环次数:9 内循环次数:45
排序后 0 排序后 1 排序后 2 排序后 3 排序后 4 排序后 5 排序后 6 排序后 7 排序后 8 排序后 9