首页 > 其他分享 >冒泡 选择 二分

冒泡 选择 二分

时间:2024-08-07 12:05:19浏览次数:8  
标签:二分 arr int 元素 选择 static 冒泡 数组 排序


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

public class App {

    public static final int LENGTH = 6;
    public static Random random = new Random();
    public static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        // 创建一个长度为LENGTH的整型数组
        int[] arr = new int[LENGTH];
        // 初始化数组
        initArray(arr);
        // 打印排序之前的数组
        traverseArray(arr);
        // 使用冒泡排序对数组进行排序
        bubbleSort(arr);
        // 打印冒泡排序之后的数组
        traverseArray(arr);
        // 使用选择排序对数组进行排序
        selectionSort(arr);
        // 打印选择排序之后的数组
        traverseArray(arr);
        // 使用反转排序对数组进行排序
        reverseSort(arr);
        // 打印反转排序之后的数组
        traverseArray(arr);
        // 提示用户输入待查找的元素
        System.out.print("请选择待查找的元素:   ");
        // 读取用户输入的待查找元素
        int targetNum = scanner.nextInt();
        // 使用二分查找算法查找目标元素的索引
        int index = binnarySearch(arr, targetNum);
        // 打印查找结果
        System.out.println(index);
    }

    // private static int binnarySearch(int[] arr, int targetNum) {
    //     for (int low = 0, high = arr.length - 1; low <= high;) {
    //         int mid = (low + high) / 2;
    //         if (targetNum > arr[mid]) {
    //             low = mid + 1;
    //             continue;
    //         } else if (targetNum < arr[mid])
    //             high = mid - 1;
    //         else
    //             return mid;
    //     }
    //     return -1;
    // }

    /**
     * 使用二分查找算法在有序数组中查找指定元素的索引
     * 二分查找通过不断缩小搜索范围来提高查找效率,是一种高效的查找算法
     * 
     * @param arr 一个已按升序排列的整型数组
     * @param targetNum 需要查找的目标数字
     * @return 如果目标数字存在于数组中,则返回其索引;否则返回-1
     */
    private static int binnarySearch(int[] arr, int targetNum) {
        // 初始化搜索范围的左右边界
        int left = 0;
        int right = arr.length - 1;
        // 计算中间位置的索引
        int mid = (left + right) / 2;
        // 当左边界不大于右边界时,表示搜索范围仍然有效
        while (left <= right) {
            // 检查中间位置的元素是否等于目标数字
            if (arr[mid] == targetNum)
                return mid;
            // 如果目标数字大于中间元素,调整左边界
            if (targetNum > arr[mid])
                left = mid + 1;
            // 如果目标数字小于中间元素,调整右边界
            if (targetNum < arr[mid])
                right = mid - 1;
            // 重新计算中间位置的索引
            mid = (left + right) / 2;
        }
        // 如果没有找到目标数字,返回-1
        return -1;
    }


    /**
     * Reverse sorts the given array in place.
     * This method uses the XOR bitwise operation to swap elements, avoiding the need for a temporary variable.
     * 
     * @param arr The array to be reverse sorted.
     */
    private static void reverseSort(int[] arr) {
        // Iterate over the first half of the array elements
        for (int i = 0; i < arr.length / 2; i++) {
            // Use XOR bitwise operation to swap the elements at both ends, no need for a temporary variable
            int t = arr[i] ^ arr[arr.length - 1 - i];
            arr[i] ^= t;
            arr[arr.length - 1 - i] ^= t;
        }
    }

    /**
     * 使用选择排序算法对整数数组进行排序
     * 该方法在每一轮迭代中找到数组中最大的元素,并将其与当前位置的元素交换
     * 从而逐步将最大的元素移动到数组的末尾
     *
     * @param arr 待排序的整数数组
     */
    private static void selectionSort(int[] arr) {
        // 遍历数组,除了最后一个元素,因为最后一步排序会将其放置在正确的位置
        for (int i = 0; i < arr.length - 1; i++) {
            // 假设当前遍历的元素是最大的
            int maxIndex = i;
            // 获取假设的最大值
            int maxValue = arr[maxIndex];
            // 遍历当前元素之后的所有元素,寻找实际的最大值
            for (int j = i + 1; j < arr.length; j++) {
                // 如果找到比当前最大值更大的元素
                if (arr[j] > maxValue) {
                    // 更新最大值及其索引
                    maxValue = arr[j];
                    maxIndex = j;
                }
            }
            // 如果最大值的索引发生变化,则交换最大值和当前位置的元素
            if (maxIndex != i) {
                // 使用位运算进行无变量交换
                int t = arr[maxIndex] ^ arr[i];
                arr[maxIndex] ^= t;
                arr[i] ^= t;
            }
        }
    }

/**
 * 使用冒泡排序算法对整数数组进行排序
 * 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,比较相邻的元素并交换它们,直到数组排序完成
 * 
 * @param arr 待排序的整数数组
 */
private static void bubbleSort(int[] arr) {
    // 遍历数组,每次迭代将最大的元素移动到数组的末尾
    for (int i = 0; i < arr.length - 1; i++) {
        // 在每次迭代中,比较并交换相邻的元素
        for (int j = 0; j < arr.length - 1 - i; j++) {
            // 如果当前元素大于下一个元素,则交换它们
            if (arr[j] > arr[j + 1]) {
                // 使用位运算进行无临时变量交换
                int t = arr[j] ^ arr[j + 1];
                arr[j] ^= t;
                arr[j + 1] ^= t;
            }
        }
    }
}

/**
 * 打印整型数组

 * 本方法通过接收一个整型数组作为参数,并将其转换为字符串形式打印出来
 * 这样做可以方便地展示数组中的所有元素,有助于调试和查看数组内容
 *
 * @param arr 需要打印的整型数组
 */
private static void traverseArray(int[] arr) {
    System.out.println(Arrays.toString(arr));
}

/**
 * 初始化整型数组
 * @param arr 需要初始化的整型数组
 * 此方法通过为数组的每个元素赋予一个随机数(范围为0到99),来实现数组的初始化
 * 选择0到99的范围是为了确保随机数的范围既不太小也不太大,以便在各种情境下使用
 */
private static void initArray(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        arr[i] = random.nextInt(100);
    }
}

}



标签:二分,arr,int,元素,选择,static,冒泡,数组,排序
From: https://www.cnblogs.com/itcq1024/p/18346798

相关文章

  • jQuery入门(二)jQuery选择器
    JQuery选择器选择器:类似于CSS的选择器,可以帮助我们获取元素。例如:id选择器、类选择器、元素选择器、属性选择器等等。jQuery中选择器的语法:$();一、jQuery的选择器(一)基本选择器1.元素选择器语法:$("元素的名称")作用:根据元素名称获取元......
  • 整体二分
    学了一下,感觉不深刻。说是整体二分,不如说是离线的归并排序。考虑这个问题:LuoguP3834【模板】可持久化线段树2\(m\)次询问,每次询问给出\((l,r,k)\),问\([l,r]\)中第\(k\)小的值。我们首先先简化一下:如果\(m=1\),怎么维护?先二分出一个\(x\),建立树状数组维护\(\lex\)......
  • 利用指针来升序数组,(冒泡排序)
    我们写完数组后,通过写函数来是代码清晰明了,第一个升序函数,通过传入arr与len,再用冒泡排序的方法即可将数组升序,这里注意,传入arr,也就是数组的首地址,函数用Int*arr接受,这里传入首地址,也就是指针的方法,这个首地址(指针)允许函数内部通过数组索引的方法来访问数组中的其他元素,......
  • 排序算法 选择排序 SelectSort -- C语言实现
    选择排序描述选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了。算法步骤首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻......
  • 排序算法 冒泡排序 BubbleSort -- C语言实现
    冒泡排序描述冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢......
  • ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验
    本文主要记录了如何使用ArgoWorkflow构建流水线,以及ArgoWorkflow中的Workflow、Template等概念模型。本文主要分析以下问题:1)如何创建流水线2)Workflow、Template、template自己的引用关系3)Workflow和Template之间的参数传递问题4)ArgoWorkflow流水线最佳实践1......
  • 冒泡排序算法
    冒泡排序核心思想:两两相邻的元素进行比较。比如一组数据,{7,2,6,5,0}让其按升序排序。第一趟:(1)2,7,6,5,0     12元素比较,7比2大,交换(2)2,6,7,5,0     23元素比较,7比6大,交换(3)2,6,5,7,0     34元素比较,7比5大,交换(4)2,6,5,0,7     45元素比较,7比0大,交换-五个元......
  • .NET发布时选择【独立部署模式】引发的故事
    目录win-x64发布发布时选择发布后文件应用程序是怎么运行的linux-x64发布发布时选择发布后文件应用程序是怎么运行的 故事:用vs2019发布.netcore3.1项目时选择了独立部署模式,突然很好奇想扒一扒在不依赖框架的情况下程序是怎么运行的?进而又想到在Linux......
  • Zynq-7020的架构知识、与传统嵌入式芯片的区别以及选择时机
    引言Zynq-7020是赛灵思(Xilinx)公司推出的一款高度集成的可编程片上系统(SoC),融合了FPGA的灵活性和处理器的性能。本文将详细介绍Zynq-7020的架构知识,分析其与传统嵌入式芯片的区别,并探讨在何种情况下选择Zynq-7020。一、Zynq-7020的架构知识1.可编程逻辑单元(PL)FPGA部分:Zynq-7......
  • Apache Flink开发时选择Java还是Scala作为编程语言
    在ApacheFlink的开发过程中,选择Java还是Scala作为编程语言是一个重要的决策点。这两种语言各有其独特的优势和特点,适合不同的开发场景和需求。以下是对这一选择的详细探讨,旨在帮助开发者更好地理解并做出合理的选择。一、ApacheFlink简介ApacheFlink是一个开源的分布式......