Java冒泡排序降序

wwwlinfei 2011-06-28 09:16:27
//冒泡排序降序(从大到小)
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]);
}
...全文
665 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
叮当你去哪了 2011-07-01
  • 打赏
  • 举报
回复
都是正确的,就是执行的效率不一样~
chen7788 2011-06-29
  • 打赏
  • 举报
回复
以上回答的都不错哈~~~
java爱好者 2011-06-29
  • 打赏
  • 举报
回复
for(int j=0;j<num2.length-1-i;j++){ //这里我有点不懂,把num2.length-1-i后面的-i去掉可以一样用,这是为


这句是 -i 是去除掉已经排好序的数,每次循环排序的时候肯定有一个数被排好,既然这个数已经被排好了,所以下次比较的时候就没有必要和这个数比较了!故去掉这个数 也就是 -i
qybao 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zyc13701469860 的回复:]
引用楼主 wwwlinfei 的回复:
//冒泡排序降序(从大到小)
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……
[/Quote]

怎么会算出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后面去了
dong_very_good 2011-06-29
  • 打赏
  • 举报
回复
四楼正解。。。
chenchenyangll 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zyc13701469860 的回复:]

引用楼主 wwwlinfei 的回复:
//冒泡排序降序(从大到小)
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.leng……
[/Quote]

虽然没有必要拘泥于名字。但你这个已经不是冒泡了吧?更像是选择= =
zn85600301 2011-06-29
  • 打赏
  • 举报
回复
减少不必要的循环次数而已

看不懂DEBUG进去看下变量值就明白了
Jeelon 2011-06-29
  • 打赏
  • 举报
回复
4#的说的不错 冒泡升序已是同理...
Mourinho 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 wwwlinfei 的回复:]
//冒泡排序降序(从大到小)
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++){ //这里……
[/Quote]

楼主算法的比较次数为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);
}
wwwlinfei 2011-06-29
  • 打赏
  • 举报
回复
谢谢各位的帮忙,小弟感激不尽啊
lxy15329 2011-06-29
  • 打赏
  • 举报
回复
七楼是正解,正好回答了lz的问题啊
riyuezhizhi 2011-06-29
  • 打赏
  • 举报
回复
呵呵,楼上的都是高手,正解,
qybao 2011-06-28
  • 打赏
  • 举报
回复
LS都说了,我也凑个热闹
其实冒泡就是一种“沉底”,反过来看就是“冒泡”了
小循环里每次把最小的“沉底”里,所以下次比较的时候,就不要再跟“沉”下去的比了,你去掉-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]) //“浮”上来的下次就不需要再比较了
TKD03072010 2011-06-28
  • 打赏
  • 举报
回复
楼上正解
楼主用debug跟踪一下 也知道
春文秋武 2011-06-28
  • 打赏
  • 举报
回复
“把num2.length-1-i后面的-i去掉可以一样用”,每次循环都找到一个最小的,因为倒数i个都是排好序的,已经是最小的,所以没必要再进行比较,故num2.length-1-i。去掉-i,增加了每个循环的比较次数...但不会影响结果了
飞跃颠峰 2011-06-28
  • 打赏
  • 举报
回复
4楼才是正解
每循环一次都把最小的放到最后去了,注释写错了哈
chenchenyangll 2011-06-28
  • 打赏
  • 举报
回复
外循环第一次,把最小的放在最后面
外循环第二次,把次小的放在倒数第二位

所以j可以只循环到num2.length-1-i,因为后面的肯定比当前的小,不用比较

那注释是LZ写的?再看看吧

2L 3L 都被你忽悠了
healer_kx 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 death_spank 的回复:]

外层循环完成一次就把最大的放在最前面了,再循环一次第一位已经是最大了,有必要拿第一位比吗?第二次到第n次也是同样的道理
[/Quote]

嗯,对对,够仔细。
Death_Spank 2011-06-28
  • 打赏
  • 举报
回复
外层循环完成一次就把最大的放在最前面了,再循环一次第一位已经是最大了,有必要拿第一位比吗?第二次到第n次也是同样的道理
healer_kx 2011-06-28
  • 打赏
  • 举报
回复
UP,支持一下,

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧