Java数组排序-----冒泡排序及其优化

冒泡排序的实现原理是两个相邻的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换。
  1.  比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2.  对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,最后的元素应该会是最大的数。
  3.  针对所有的元素重复以上的步骤,除了最后一个。
  4.  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class MaoPaoDemo {
	// 遍历数组的功能。
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x != arr.length - 1)
				System.out.print(arr[x] + ", ");
			else
				System.out.println(arr[x] + "]");
		}
	}

	public static void main(String[] args) {
		int[] arr = { 34, 19, 11, 109, 3, 56 };
		bubbleSort(arr);
		printArray(arr);

	}

	public static void swap(int[] arr, int a, int b) {
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

	/*
	 * 冒泡排序。
	 */
	public static void bubbleSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {//控制外循环次数
			for (int y = 0; y < arr.length - 1 - x; y++) {//-1是为了避免角标越界异常,-x是为了减少外循环次数
				if (arr[y] > arr[y + 1]) {//判断两个相邻元素的大小
					swap(arr, y, y + 1);
				}
			}
		}
	}
}

输出结果:

其中的实现过程如下表示:

{ 34, 19, 11, 109, 3, 56 }//没有排序之前的数组顺序

执行第一次外循环:

        执行内循环,开始第一次排序

        34 >19交换位置  { 34, 19, 11, 109, 3, 56 }       { 19, 34, 11, 109, 3, 56 }

        第二次内循环排序

        34 < 11交换位置  { 19, 34, 11, 109, 3, 56 }    { 19, 11, 34, 109, 3, 56 }

        第三次内循环排序

        34 < 109 不交换位置 { 19, 11, 34, 109, 3, 56 }     { 19, 11, 34, 109, 3, 56 }

        第四次内循环排序

        109 > 3 交换位置  { 19, 11, 34, 109, 3, 56 }      { 19, 11, 34, 3, 109, 56 }

        第五次次内循环排序

        109 > 56 交换位置 { 19, 11, 34, 3, 109, 56}      { 19, 11, 34, 3, 56, 109 }

............................................................................................................................................................................

执行第二次外循环:

        执行内循环,开始第一次排序

        19>11 交换位置  { 19, 11, 34, 3, 56, 109 }   { 11, 19, 34, 3, 56, 109 }

        第二次内循环排序

        34 > 3 交换位置  { 11, 19, 34, 3, 56, 109 }  { 11, 19, 3, 34, 56, 109 }

        第三次内循环排序

        34 < 56 不变位置  { 11, 19, 3, 34, 56, 109 }  { 11, 19, 3, 34, 56, 109 }

        第四次内循环排序

        56 < 109不变位置 { 11, 19, 3, 34, 56, 109 }  { 11, 19, 3, 34, 56, 109 }

............................................................................................................................................................................

执行第三次外循环:

        执行内循环,开始第一次排序

         11 < 19 不交换  { 11, 19, 3, 34, 56, 109 } {11, 19, 3, 34, 56, 109 }

        第二次内循环排序

         19 > 3 交换位置  {11, 19, 3, 34, 56, 109 }  {11, 3, 19, 34, 56, 109 }

        第三次内循环排序

        34 < 56 不交换   {11, 3, 19, 34, 56, 109 } {11, 3, 19, 34, 56, 109 }

............................................................................................................................................................................

执行第四次外循环:

        执行内循环,开始第一次排序

       11 > 3交换位置  {11, 3, 19, 34, 56, 109 }   {3, 11, 19, 34, 56, 109 }

       19 < 34 不交换   {3, 11, 19, 34, 56, 109 }   {3, 11, 19, 34, 56, 109 }  

执行第五次外循环:

   执行内循环,开始第一次排序

    3 <11 不交换     {3, 11, 19, 34, 56, 109 {3, 11, 19, 34, 56, 109

冒泡排序性能优化:

当某一次遍历没有发生交换,就说明已经遍历好了,就不用再继续迭代了,不必为已经是排序好的顺序继续排序

public class MaoPaoDemo {
    // 遍历数组的功能。
    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int x = 0; x < arr.length; x++) {
            if (x != arr.length - 1)
                System.out.print(arr[x] + ", ");
            else
                System.out.println(arr[x] + "]");
        }
    }

    public static void main(String[] args) {
        int[] arr = { 2, 1, 3, 4 };
        bubbleSort(arr);
        printArray(arr);

    }

    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    /*
     * 冒泡排序。
     */
    public static void bubbleSort(int[] arr) {
        int sum = 0;
        int a = 0;
        boolean flag = false;
        for (int x = 0; x < arr.length - 1; x++) {
            for (int y = 0; y < arr.length - 1 - x; y++) {
                if (arr[y] > arr[y + 1]) {
                    swap(arr, y, y + 1);
                    flag = true;
                }
                sum++;
                System.out.println("内循环排序第----------" + sum+"圈");
                if (flag == true) {
                    a++;
                }
            }
            if (flag == false) {
                System.out.println("外循环还剩+++++++++++++++++++++++++++++++" + sum+"圈");
                sum = 0;
                System.out.println("没有排序");
                System.out.println("交换了" + a + "次位置");
                break;
            }
            System.out.println("排序了");
            System.out.println("外循环还剩+++++++++++++++++++++++++++++++" + sum+"圈");
            sum = 0;
            System.out.println("交换了" + a + "次位置");
        }
        if(sum==0) {
            System.out.println("排序完毕,剩余外循环"+sum+"圈");
        }
    }
}

int[] arr = { 1, 2, 3, 4 }


int[] arr = { 2, 1, 3, 4 }



  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值