//冒泡排序降序(从大到小)
int temp=0; //临时变量
int[] num2=new int[]{90,55,33,88,100,-5,-7,1};
for(int i=0;i<num2.length-1;i++){ //外层循环控制循环多少轮
//内层循环把最大的元素交换到最前
for(int j=0;j<num2.length-1-i;j++){ //这里我有点不懂,把num2.length-1-i后面的-i去掉可以一样用,这是为什么?
if(num2[j]<num2[j+1]){
//交换元素
temp=num2[j];
num2[j]=num2[j+1];
num2[j+1]=temp;
}
}
}
for(int i=0;i<num2.length;i++){
System.out.println(num2[i]);
}
int temp=0; //临时变量
int[] num2=new int[]{90,55,33,88,100,-5,-7,1};
for(int i=0;i<num2.length-1;i++){ //外层循环控制循环多少轮
//内层循环把最大的元素交换到最前
for(int j=0;j<num2.length-1-i;j++){ //这里我有点不懂,把num2.length-1-i后面的-i去掉可以一样用,这是为什么?
if(num2[j]<num2[j+1]){
//交换元素
temp=num2[j];
num2[j]=num2[j+1];
num2[j+1]=temp;
}
}
}
for(int i=0;i<num2.length;i++){
System.out.println(num2[i]);
}
外循环第二次,把次小的放在倒数第二位所以j可以只循环到num2.length-1-i,因为后面的肯定比当前的小,不用比较那注释是LZ写的?再看看吧2L 3L 都被你忽悠了
楼主用debug跟踪一下 也知道
其实冒泡就是一种“沉底”,反过来看就是“冒泡”了
小循环里每次把最小的“沉底”里,所以下次比较的时候,就不要再跟“沉”下去的比了,你去掉-i没关系,就是每次都和沉底的比一次,不过不会发生变化,也就豪无意义了。for(int i=0;i<num2.length-1;i++){
for(int j=num2.length-1;j>i;j--){ //反过来就真的冒泡了,每次把最大的“浮”上来,浮到i位置
if (num2[j]>num2[j-1]) //“浮”上来的下次就不需要再比较了
楼主算法的比较次数为N^2,其实还可以优化下,比较N(N-1)/2次 public static void main(String[] args) {
int k = 0;//统计循环执行次数
int temp = 0; // 临时变量
int[] num2 = new int[] { 90, 55, 33, 88, 100, -5, -7, 1 };
for (int i = 0; i < num2.length; i++) { // 外层循环控制循环多少轮
for (int j = i + 1; j < num2.length; j++) {
k++;
if (num2[j] > num2[i]) {
// 交换元素
temp = num2[j];
num2[j] = num2[i];
num2[i] = temp;
}
}
}
for (int i = 0; i < num2.length; i++) {
System.out.print(num2[i] + " ");
}
System.out.println();
System.out.println("k = " + k);
}
怎么会算出n^2的?
小循环的次数依次为
n-1, n-2, n-3, ..., 1
所以总次数为 1+2+3+...+n-1 = n(n-1)/2而且你的那个不是冒泡,是选择排序,属于不稳定排序,也就是说不能保证排序前的顺序
如 2, 2, 1, 3 升序排序,经过排序后,第1个2就排到第2个2后面去了
这句是 -i 是去除掉已经排好序的数,每次循环排序的时候肯定有一个数被排好,既然这个数已经被排好了,所以下次比较的时候就没有必要和这个数比较了!故去掉这个数 也就是 -i