java常见排序算法:冒泡排序 二分法排序

本文详细介绍了Java中的两种经典排序算法:冒泡排序和二分法排序。首先,通过生动的比喻解释了冒泡排序的工作原理,并提供了冒泡排序的代码实现及排序结果展示。接着,探讨了二分法排序的概念,给出了二分法在有序数组中查找特定数值的实例,以及如何利用二分法对数组进行排序的思路和关键点。整个内容旨在帮助读者深入理解这两种排序方法的细节和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序算法

什么是冒泡排序

我们可以形象的理解为:大小不一的气泡向上浮动,到最后,大的气泡飘到了上面,小的在下面。
无序的排序规则也是这样,每次比较相邻的两个数值,如果之前的数值比后面的数值大,就进行交换,不然就不执行交换,比较下一对,最后,会将遍历出来的最大数值拍到最后
动图演示:---- 动图来源:https://visualgo.net/
在这里插入图片描述

对算法进行分析:

  • 比较相邻的两个元素,如果前面的币后面的大,则交换
  • 对每一对相邻的元素都进行这样的两个数值,如果前面的数值大于后面的数值,就进行交换,这样,最后的元素就是本次遍历完剩下的最大的元素
  • 针对所有元素执行上面的步骤,除了已经找到的 最大的元素(可能在序列的末尾)
  • 重复以上过程,直到排序结束

冒泡排序代码:

package com.demo;

import java.util.Arrays;

public class Shuzu {
    public static void main(String[ ] args) {
        int[ ] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };
        bubbleSort(values);
        System.out.println(Arrays.toString(values));
    }
    public static void bubbleSort(int[ ] values) {
        int temp;
        int i;
        // 外层循环:n个元素排序,则至多需要n-1趟循环
        for (i = 0; i < values.length - 1; i++) {
            // 定义一个布尔类型的变量,标记数组是否已达到有序状态
            boolean flag = true;
            /*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序 数组的最后*/
            for (int j = 0; j < values.length - 1 - i; j++) {
                // 如果前一个元素大于后一个元素,则交换两元素的值
                if (values[j] > values[j + 1]) {
                    temp = values[j];
                    values[j] = values[j + 1];
                    values[j + 1] = temp;
                    //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;
                    flag = false;
                }
            }
            //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
             if (flag) {
                 break; 
             }
        }
    }
 }

排序结果:

在这里插入图片描述

二分法查找

什么是二分法排序?

二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元 素从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关 键码(key)比较,如果相等,则检索成功; 否则,若 key 小,则在数组前半部分中继续进行二分法检索; 若 key 大,则在数组后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。

实例:

在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到 10 元素,过程如下:
在这里插入图片描述
二分法对数组进行排序:
在这里插入图片描述

代码:

在数组内找到指定的数值:

package com.demo;

import java.util.Arrays;

public class Shuzu {
    public static void main(String[] args) {
        int[] arr = {30, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};
        int searchWord = 20; // 所要查找的数
        Arrays.sort(arr);  //二分法查找之前,一定要对数组元素排序
        System.out.println(Arrays.toString(arr));   //对数组排序后的结果
        System.out.println(searchWord+"元素的索引: "+binarySearch(arr,searchWord));
    }

    public static int binarySearch(int[ ] array, int value){
        int low = 0;
        int high = array.length - 1;
        while(low <= high){
            int middle = (low + high) / 2;
            if(value == array[middle]){
                return middle;  //返回查询到的索引位置
                }
            if(value > array[middle]){
                low = middle + 1;
            }
            if(value < array[middle]){
                high = middle - 1;
            }
        }
    return -1;  //上面循环完毕,说明未找到,返回-1
    }
}

结果:
在这里插入图片描述

对无序数组进行排序

package com.demo; 

public class Shuzu {
    public static void main(String[] args) {
        int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1};
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];  //要插入的第i个元素
            int low = 0;
            int high = i - 1; //插入目标元素的前 i-1 个元素
            int mid = -1;
            while (low <= high) {
                mid = low + (high - low) / 2;
                if (arr[mid] > temp) {
                    high = mid - 1;
                } else { // 元素相同时,也插入在后面的位置
                    low = mid + 1;
                }
            }
            // 目标位置 之后的元素 整体移动一位
            for(int j = i - 1; j >= low; j--) {
                arr[j + 1] = arr[j];
            }
            arr[low] = temp;
        }
        for (int i = 0; i < arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
    }

}

排序结果:
在这里插入图片描述

二分法要点:

使用二分法算法,也可以对数组进行排序
使用二分法进行查找数组的元素时,我们需要先保证,数组的元素是有序的

原理:

每次都在找中间的那个元素,比较大或小就可以减少一半的元素

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值