冒泡排序-优化(狂神说版)

1.思路:

冒泡排序:比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置。

2.做法

2.1定义冒泡排序的方法

我们要知道给数组排序那么返回值就一定是一个数组,方法名就取sort排序。参数我们要对谁做什么,对数组进行排序,参数自然就是数组。

public static int[] sort(int[] array) {}

于此同时还需要定义一个中间变量来作为交换位置的媒介。

int temp;

2.2.循环

比较两个数的大小不止一次比较,多次就一定会用到循环,那就一定要想到for循环,至于为什么要用for循环就不得而知了,for循环还需要用到两次,为什么要用到两次?因为第一次是用来判断我们要走多少次循环,而且循环的次数一定要是数组长度减去一个1;即array.length - 1。有人又问为啥要减去一个一,因为不减去一个1就会数组下标越界的错误。

内层循环才是真正的比较;这里的array.length - 1 - i是表示比较的次数不断减少,需要再减去一个i,因为每一次遍历都会得出一个最大的数字。

for (int j = 0; j < array.length - 1 - i; j++) {
        if (array[j + 1] > array[j]) { // 如果比较数组中第二个数比第二个数比第一个数大。
          temp = array[j];  // 则先把前一位数和temp 交换位置。
          array[j] = array[j + 1];// 再把后一位和前一位交换位置。
          array[j + 1] = temp;// 最后把temp放回原来的位置。
          flag = true;
        }

交换完成把这个数组返回出去就好了。

return array;

2.3.Main方法

要对数组排序首先要有数组,这个步骤可以在写好排序方法之后再定义,定义一个数组长度为19的名字为a数组。接着调用sort数组冒泡排序方法,把需要对排序的数组传进去,返回一个变量也叫sort。最后通过Arrays类中的toString方法把数组显示出来不然只会出现一串数字。

public static void main(String[] args) {
    int[] a = {2, 3, 1, 8, 6, 2, 7, 10, 20, 100, 200, 50, 60, 10, 205, 625, 165, 325, 845}; // 定义一个数组。
    int[] sort = sort(a); // 调用sort排序的方法,然后把需要排序的数组名字‘a’传进去。
    System.out.println(Arrays.toString(sort)); // 使用Arrays类中的toString方法把数组显示出来不然只会出现一串数字。
  }

3.源代码

import java.util.Arrays;

public class Main {

  /*
  1.冒泡排序:比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们位置。
  2.每一次比较,都会产生出一个最大,或者最小的数数。
  3.下一轮则可以少一次排序。
  4.一次循环,直到结束!
   */
  public static void main(String[] args) {
    int[] a = {2, 3, 1, 8, 6, 2, 7, 10, 20, 100, 200, 50, 60, 10, 205, 625, 165, 325, 845}; // 定义一个数组。
    int[] sort = sort(a); // 调用sort排序的方法,然后把需要排序的数组名字‘a’传进去。
    System.out.println(Arrays.toString(sort)); // 使用Arrays类中的toString方法把数组显示出来不然只会出现一串数字。
  }

  public static int[] sort(int[] array) {
    //      定义一个临时变量作为交换位置的中间变量。
    int temp;
    //    外层循环,判断我们这个要走多少次。
    for (int i = 0; i < array.length - 1; i++) {
      boolean flag = false; // 通过flag标志位减少没有意义的比较。
      //      内层循环,比价判断这两个数,如果一个数比第二个数大,则交换位置。
      for (int j = 0; j < array.length - 1 - i; j++) {
        if (array[j + 1] > array[j]) { // 如果比较数组中第二个数比第二个数比第一个数大。
          temp = array[j];  // 则先把前一位数和temp 交换位置。
          array[j] = array[j + 1];// 再把后一位和前一位交换位置。
          array[j + 1] = temp;// 最后把temp放回原来的位置。
          flag = true;
        }
      }
      //      如果没有进行比较的话,咱们就进行结束了。
      if (flag == false) {
        // 退出可,跳出循环,最后一轮就不用走了,这样也是可以降低时间成本的。
        break; // break ,跳出内层循环。
      }
    }
    return array; // 最后把这个数组给返回出去。
  }
}

4.运行结果

在这里插入图片描述

写在最后

人生就像一本书,傻瓜们走马看花似地随手翻阅它,聪明的人用心地阅读它。因为他知道这本书只能读一次。——保罗

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值