java实现冒泡排序以及二分查找法

一、冒泡排序

原理:

冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,一次比较两个元素,并且如果它们的顺序错误就交换它们。这个过程重复进行直到整个序列都是有序的。

冒泡排序的基本思想是通过相邻元素的比较和交换,将最大(或最小)的元素逐渐“冒泡”到序列的末尾。具体步骤如下:

1. 从序列的第一个元素开始,依次比较相邻的两个元素。
2. 如果这两个元素的顺序错误(比如,前一个元素大于后一个元素),就交换它们的位置。
3. 继续比较下一对相邻元素,直到整个序列都被遍历过。
4. 重复以上步骤,每次遍历都会将当前最大(或最小)的元素“冒泡”到序列的末尾。
5. 重复执行 n-1 轮遍历,直到整个序列都是有序的。

冒泡排序的时间复杂度为 O(n^2),其中 n 是序列的长度。在最坏情况下,需要进行 n-1 轮遍历,每轮遍历需要比较 n-i-1 次相邻元素并进行交换,因此总的比较和交换次数为 (n-1) * (n-1) = n^2 - 2n + 1。

 实现思路:

  1. 定义一个函数 bubbleSort,接受一个待排序的数组作为参数。
  2. 使用两层循环来实现冒泡排序。外层循环控制遍历的轮数,内层循环用于比较相邻元素并进行交换。
  3. 在每一轮遍历中,从第一个元素开始,比较相邻的两个元素,如果顺序错误就交换它们的位置。
  4. 内层循环的结束条件是遍历到倒数第二个元素,因为最后一个元素已经是有序的。
  5. 每一轮遍历结束后,最大(或最小)的元素会“冒泡”到序列的末尾,因此下一轮遍历只需要遍历到倒数第二个元素即可。
  6. 最后,返回排序后的数组。

代码实现:

import java.util.Arrays;
import java.util.Scanner;

public class Bubble_Sort {
    public static void main(String[] args) {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        int arr_temp;
        //i控制比较次数
        for (int i = 1;i <= arr.length;i++){
            //j遍历数组并进行比较
            for (int j = 0;j <= arr.length-i-1;j++){
                if (arr[j] > arr[j+1]){
                    arr_temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = arr_temp;
                }
            }
        }
        //输出结果
        System.out.println(Arrays.toString(arr));
    }
}

 二、二分查找法

原理:

二分查找法是一种在有序数组中查找目标元素的算法。它的原理是通过将目标元素与数组的中间元素进行比较,从而确定目标元素在数组的左半部分还是右半部分,然后在相应的部分继续进行查找,直到找到目标元素或者确定目标元素不存在。

实现思路:

1. 首先,确定数组的左边界和右边界,左边界初始值为 0,右边界初始值为数组长度减 1。
2. 在每一次迭代中,计算中间位置 mid,mid 的值为 (左边界 + 右边界) / 2。
3. 比较目标元素与中间位置的元素的大小关系:
   - 如果目标元素等于中间位置的元素,则找到目标元素,返回中间位置。
   - 如果目标元素小于中间位置的元素,则目标元素可能在左半部分,将右边界更新为 mid-1。
   - 如果目标元素大于中间位置的元素,则目标元素可能在右半部分,将左边界更新为 mid+1。
4. 重复上述步骤,直到左边界大于右边界,此时数组中不存在目标元素,则提示不存在。

二分查找法的时间复杂度为 O(log n),其中 n 是数组的长度。由于每次迭代都将查找范围缩小一半,因此最多需要 log n 次迭代才能找到目标元素或确定目标元素不存在。

 注意:

当一个数组中存在多个相同的数的时候,可以先利用二分法找到相同的数,再遍历前后位置,直到找到不同的数字为止。

代码实现:

import java.util.Arrays;
import java.util.Scanner;

public interface Binary_search {
    public static void main(String[] args) {
        int[] arr = {3,3,3,3,3,6,7,8,9,12,12,36,45,45,45};
        //先对数组进行排列,使用冒泡排序
        int arr_temp;
        //i控制比较次数
        for (int i = 1;i <= arr.length;i++){
            //j遍历数组并进行比较
            for (int j = 0;j <= arr.length-i-1;j++){
                if (arr[j] > arr[j+1]){
                    arr_temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = arr_temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));

        //下面是查找
        Scanner input = new Scanner(System.in);
        System.out.println("请输入你要查找的数字:");
        int n= input.nextInt();
        //定义初始末位置
        int first_index = 0;
        int last_index = arr.length - 1;
        int mid_index = (first_index + last_index) / 2;

        //while循环控制比较次数,只要查找的数字不等于n,就一直循环
        while (arr[mid_index] != n){
            if (arr[mid_index] > n){
                //当要查找的数字比中间数小的时候,就应该在前面的数之中进行查找,所以这里末位置变为mid_index-1
                last_index = mid_index - 1;
            }else if (arr[mid_index] < n){
                //当要查找的数字比中间数大的时候,就应该在后面的数之中进行查找,所以这里起始位置变为mid_index+1
                first_index = mid_index + 1;
            }
            if (first_index>=last_index){
                break;
            }
            //将新的始末位置进相加除以2,就是新的中间值,再进行查找比较
            mid_index = (first_index + last_index) / 2;
        }
        if (arr[mid_index] == n){
            System.out.println(mid_index);
            //输出结果
            System.out.println(n + "的位置在数组中是第:" + mid_index + "位");
        }else{
            System.out.println("你查找的数字不存在!");
        }

        //当一个数组有几个相同的数时,先找到第一个数,也就是上面找到的数,再往前查找,如果前一位和这个数相等,则将这个数位置输出,然后继续往前找
       for(int i=mid_index-1;i>=first_index;i--){
           if (arr[i]==n){
               System.out.println(n + "的位置在数组中是第:" + i + "位");
           }
       }
        //当一个数组有几个相同的数时,先找到第一个数,也就是上面找到的数,再往后查找,如果后一位和这个数相等,则将这个数位置输出,然后继续往后找
        for(int i=mid_index+1;i<=last_index;i++){
            if (arr[i]==n){
                System.out.println(n + "的位置在数组中是第:" + i + "位");
            }
        }

    }
}

本人水平有限,存在错误的地方欢迎指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值