新手 关于冒泡排序的问题

FMouse111 2017-09-26 07:56:09
public void sort(int[] arr) {
int tmp;
for(int i = 1; i < arr.length; i++) {
// 待插入数据
tmp = arr[i];
int j;
for(j = i - 1; j >= 0; j--) {
// 判断是否大于tmp,大于则后移一位
if(arr[j] > tmp) {
arr[j+1] = arr[j];
}else{
break;
}
}
arr[j+1] = tmp;
System.out.println(i + ":" + Arrays.toString(arr));
}
}
为什么是arr[j+1] =tmp,而不是arr[j] = tmp?
...全文
366 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
YourMart 2017-10-14
  • 打赏
  • 举报
回复

/**
 * 
 * @type_name:BubbleSort1
 * @package_name: sortT
 * @file_name: BubbleSort1.java
 * @author: 33889
 * @E-mail: 2265693653@qq.com
 * @date :2017年10月12日 下午9:51:43 
 * @JDKversion: 1.8_121U
 * @parameter 
 * @since 
 * @return 
 * @tags: 
 * @marks:比较完整的冒泡排序(升序)
 */
public class BubbleSort1 {
	public static void main(String [] args){
		int [] a=new int []{1,99,20,30,50,66,94,12};
		int [] a1={1,122,33,423,543,53};
		
		System.out.println("初始数组数据:");
		for (int i : a1) {
			System.out.print(i+" ");
		}
		System.out.println(" ");
		
		//外层循环表示排序轮数
		for(int i=0;i<a1.length-1;++i){
			//提示轮数
			System.out.println("这是第:"+(i+1)+"轮比较");
			//内层循环表示单次排序的比较次数
			for(int j=0;j<a1.length-i-1;++j){
				//如果后一个数大于前一个数
				if(a1[j+1]<a1[j]){
					//交换位置
					int x=a1[j];
					a1[j]=a1[j+1];
					a1[j+1]=x;
					// 输出两个交换位置的值;
					System.out.println(a1[j + 1] + "和" + a1[j] + "换位置" + " ");
				} else {// 如果没有交换则打印空格,用来保持输出格式工整;
					System.out.println(" 没有数字被交换位置 ");
				}
				// 用迭代循环输出本次排序完成后的结果;
				for (int num : a1) {
					System.out.print(num + " ");
				}
				System.out.println(" ");
				// 提示进行了一次比较;
				System.out.println("进行了一次比较,"+"这是第:"+(j+1)+"次比较");
			}
		}
		
		System.out.println("完毕");
		for (int i : a1) {
			System.out.print(i+" ");
		}
	}
}
自己看看过程吧,不要去死记,重在理解,不理解记住了也没用
hangry. 2017-10-14
  • 打赏
  • 举报
回复
*/ //冒泡排序 这样写不是更好。 /* int arr[]={20,29,3923,349}; for(int i=0; i<arr.length-1; i++){ for(int j=0; j<arr.length-i-1; j++){ if(arr[j]>arr[j+1]){ //如果前面的这个数大于后面的这个数 int demo=arr[j]; //先把前面这个赋值给临时变量 arr[j]=arr[j+1]; //把后面这个赋值给前面 arr[j+1]=demo; //再把前面的这个数赋值给 } } } for(int i:arr){ System.out.println(i); }
jaramyZXG 2017-10-12
  • 打赏
  • 举报
回复
我看了半天没明白,原来是你自己写的,应该有问题,你的j值都不确定, arr[j+1] = tmp; 就这一句看了半天,在想是什么,楼上有冒泡,看下吧,两层循环里比较,在内层定义个中间变量交换就完事了
qq1184885975 2017-10-11
  • 打赏
  • 举报
回复
你这是下沉了,和冒泡反了
末流码农 2017-10-11
  • 打赏
  • 举报
回复
我就说这个冒泡咋看着这么别扭
FMouse111 2017-09-27
  • 打赏
  • 举报
回复
不好意思这个是插入排序,打错了
FMouse111 2017-09-27
  • 打赏
  • 举报
回复
[ flag = false; } } if(flag) { break; } } }[/code][/quote] 增加flag标记,就是说某次循环扫描到已经有序了,就不会再做下次扫描了,直接结束[/quote]我那个是插入排序,不好意思打错了
引用 9 楼 evanweng 的回复:
[quote=引用 7 楼 evanweng 的回复:]
private static void sort(int[] numbers)
    {
        int change = 0;
        for(int i = 1; i < numbers.length; i++)
        {
            boolean flag = true;
            for(int j = 1; j <= numbers.length - i; j++)
            {
                if(numbers[j-1] > numbers[j])
                {
                    change = numbers[j-1];
                    numbers[j-1] = numbers[j];
                    numbers[j] = change;
                    flag = false;
                }
            }
            if(flag)
            {
                break;
            }
        }
    }
增加flag标记,就是说某次循环扫描到已经有序了,就不会再做下次扫描了,直接结束[/quote]
FMouse111 2017-09-27
  • 打赏
  • 举报
回复
引用 4 楼 TY_495478072 的回复:
你这个写法就错了,冒泡不是这样写的。
打错了 ,是插入排序
evanweng 2017-09-27
  • 打赏
  • 举报
回复
引用 7 楼 evanweng 的回复:
private static void sort(int[] numbers)
    {
        int change = 0;
        for(int i = 1; i < numbers.length; i++)
        {
            boolean flag = true;
            for(int j = 1; j <= numbers.length - i; j++)
            {
                if(numbers[j-1] > numbers[j])
                {
                    change = numbers[j-1];
                    numbers[j-1] = numbers[j];
                    numbers[j] = change;
                    flag = false;
                }
            }
            if(flag)
            {
                break;
            }
        }
    }
增加flag标记,就是说某次循环扫描到已经有序了,就不会再做下次扫描了,直接结束
evanweng 2017-09-27
  • 打赏
  • 举报
回复
第一趟的j就等于0了,你的写法本来就错了吧。
evanweng 2017-09-27
  • 打赏
  • 举报
回复
private static void sort(int[] numbers)
    {
        int change = 0;
        for(int i = 1; i < numbers.length; i++)
        {
            boolean flag = true;
            for(int j = 1; j <= numbers.length - i; j++)
            {
                if(numbers[j-1] > numbers[j])
                {
                    change = numbers[j-1];
                    numbers[j-1] = numbers[j];
                    numbers[j] = change;
                    flag = false;
                }
            }
            if(flag)
            {
                break;
            }
        }
    }
galiniur0u 2017-09-27
  • 打赏
  • 举报
回复
冒泡法属于排序中最经典的算法之一,需要熟记。

	public static void sort(int[] a) {
		for (int i = 0; i < a.length; i++) {
			for (int j = i + 1; j < a.length; j++) {
				if (a[i] > a[j]) {
					int tmp = a[i];
					a[i] = a[j];
					a[j] = tmp;
				}
			}
		}
	}
TY_495478072 2017-09-26
  • 打赏
  • 举报
回复
TY_495478072 2017-09-26
  • 打赏
  • 举报
回复
你这个写法就错了,冒泡不是这样写的。
FMouse111 2017-09-26
  • 打赏
  • 举报
回复
引用 1 楼 qq_40321780 的回复:
这个你开心就好,换一下也没问题
换一下就错误了啊,求指教
FMouse111 2017-09-26
  • 打赏
  • 举报
回复
换一下就不对了啊,运行错误,求指教
七7奇 2017-09-26
  • 打赏
  • 举报
回复
这个你开心就好,换一下也没问题

62,612

社区成员

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

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