• 用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组


     

    目录

    一、冒泡排序

    1.冒泡排序介绍

    2.排序的思路

    3.完整代码

    二、折半查找

    1.折半查找介绍

    2.查找的思路

    3.完整代码

    三、逆序数组

    1.逆序思路

    2..完整代码


    一、冒泡排序

    冒泡排序是众多排序的一种,无论在C语言或者Java中都很常见,后续在数据结构中也会用到

    1.冒泡排序介绍

    (1)冒泡排序思想

    • 为两两排序,每次的排序后,最大(或最小的)就会升起到最后
    • 每完成一轮排序,需要比较的数就少一个

    (2)冒泡排序场景

    • 多用于对数组内容的排序

    2.排序的思路

    (1)完成排序需要的内容

    • 有数组
    • 需要求数组长度

    (2)排序的过程解析

    • 我们将下面数组排序成升序

    int[] arr = {10,9,8,7,6,5,4,3,2,1};
    • 第一趟冒泡排序:10个数需要比较9次,成功把一个数字排好序

    • 第二趟冒泡排序:待排序的数字有9个,所以需要比较的次数是8次

    后续的排序趟数是类似的,接下来我们总结一下规律

    • 由上图可知:10个数字一共需要比较的趟数是10-1次,也就是(arr.length-1)
    • 第一趟排序需要比较的次数为9,第二次是8;与趟数有关系,于是得出下面的代码
    1. int i =0;
    2. for (i = 0; i < arr.length-1; i++) {
    3. for (int j = 0; j < arr.length-1-i; j++) {
    4. //可自己设置条件条件
    5. if(arr[j]>arr[j+1]) {
    6. //完成两个数字的交换
    7. int tmp = arr[j+1];
    8. arr[j+1] = arr[j];
    9. arr[j] = tmp;
    10. }
    11. }
    12. }
    •  升序的条件是第一个数大于第二个数就要交换;如果是排逆序则是第一个数小于第二个数则需要交换

    3.完整代码

    1. import java.util.Arrays;
    2. public class Sort{
    3. public static void main(String[] args) {
    4. //冒泡排序
    5. int[] arr = {10,9,8,7,6,5,4,3,2,1};
    6. bubbleSort(arr);
    7. System.out.println(Arrays.toString(arr));
    8. }
    9. public static void bubbleSort(int[] arr) {
    10. //升序
    11. int i =0;
    12. for (i = 0; i < arr.length-1; i++) {
    13. for (int j = 0; j < arr.length-1-i; j++) {
    14. if(arr[j]>arr[j+1]) {
    15. int tmp = arr[j+1];
    16. arr[j+1] = arr[j];
    17. arr[j] = tmp;
    18. }
    19. }
    20. }
    21. }
    22. }

    二、折半查找

    1.折半查找介绍

    (1)折半查找,又称二分查找。

    (2)二分查找每次都是从中间位置开始查找,因此称为折半查找(二分查找)

    (3)可以进行二分查找的条件

    • 数组内的数据必须是有序的
    • 若是无序的,可以先将其排成有序

    2.查找的思路

    (1)方法的参数写法

    • 我们规定一下:找到了就返回它的下标位置,否则返回-1
    • 需要将数组和需要查找的数据传给下面的方法
    1. public static int binarySearch(int[] arr,int k) {
    2. }

    (2)查找的内部细节

    • 定位下标:定好两头位置,便于找到中间位置

    1. public static int binarySearch(int[] arr,int k) {
    2. int left = 0;
    3. int right = arr.length-1;
    4. }
    • 中间数字表示:
     int mid = (left+right)/2;

    (3)二分查找的过程解析 

    •  先看代码
    1. public static int binarySearch(int[] arr,int k) {
    2. int left = 0;
    3. int right = arr.length-1;
    4. while(left <= right) {
    5. //从中间位置开始找
    6. int mid = (left+right)/2;
    7. if(k < arr[mid]) {//k在左边
    8. right=mid-1;
    9. } else if(k > arr[mid]) {
    10. //在右边
    11. left=mid+1;
    12. } else {
    13. return mid;
    14. }
    15. }
    16. return -1;
    17. }
    • 查找过程图解 :第一次查找

    • 第二次查找:查找后,right指向10,left和mid都指向8

    • 第三、四次查找:找到了就返回mid位置的下标

    3.完整代码

    1. public static void main(String[] args) {
    2. //1.折半查找,要求数组内容为有序.找到了返回下标
    3. int[] arr1 = {2,5,7,8,10,11,15,17,20,22};
    4. int ret = binarySearch(arr1,10);
    5. System.out.println(ret);
    6. //2.当数组无序时,使用Array.sort排序后折半查找
    7. int[] arr2 = {9,8,7,6,5,4,3,2,1,0};
    8. Arrays.sort(arr2);
    9. System.out.println(Arrays.toString(arr2));
    10. int cur = binarySearch(arr2,11);
    11. System.out.println(cur);
    12. }
    13. public static int binarySearch(int[] arr,int k) {
    14. int left = 0;
    15. int right = arr.length-1;
    16. while(left <= right) {
    17. //从中间位置开始找
    18. int mid = (left+right)/2;
    19. if(k < arr[mid]) {//k在左边
    20. right=mid-1;
    21. } else if(k > arr[mid]) {
    22. //在右边
    23. left=mid+1;
    24. } else {
    25. return mid;
    26. }
    27. }
    28. return -1;
    29. }

    三、逆序数

    1.逆序思路

    (1)要求将数组内容逆序,不是逆序打印

    int[] arr = {10,9,8,7,6,5,4,3,2,1,0};

    (2)设置头尾位置

    1. public static void reverse(int[] arr) {
    2. int left = 0;//头位置
    3. int right =arr.length-1;//尾位置
    4. }

    这样是为了从两头开始交换数据

    (3)循环交换数据

    1. while(left < right) {//相等的时候就不需要逆序了
    2. int tmp = arr[left];
    3. arr[left] = arr[right];
    4. arr[right] = tmp;
    5. left++;
    6. right--;
    7. }

    内部代码其实就是实现两个数的交换;当left==right的时候,就是只剩下一个数据没有完成交换了,其实也就不需要再交换了(非要交换也行)

    2..完整代码

    1. public static void main(String[] args) {
    2. //逆序数组
    3. int[] arr = {10,9,8,7,6,5,4,3,2,1,0};
    4. reverse(arr);
    5. System.out.println(Arrays.toString(arr));
    6. }
    7. public static void reverse(int[] arr) {
    8. int left = 0;
    9. int right =arr.length-1;
    10. while(left < right) {//相等的时候就不需要逆序了
    11. int tmp = arr[left];
    12. arr[left] = arr[right];
    13. arr[right] = tmp;
    14. left++;
    15. right--;
    16. }
    17. }

  • 相关阅读:
    股票交易系列 -- 动规
    实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】
    自动化实战 - 测试个人博客系统
    基于proe的阀体零件的机械加工工艺及夹具设计
    分享几个可以免费使用GPT的网站
    算法通关村第十八关——回溯
    Vue中的路由懒加载:提高性能和用户体验
    QWeb 语法
    学习太极创客 — ESP8226 (十三)OTA
    SpringBoot 前端406 后端Could not find acceptable representation
  • 原文地址:https://blog.csdn.net/2301_77053417/article/details/134188575