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

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



一、冒泡排序

冒泡排序是众多排序的一种,无论在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;与趟数有关系,于是得出下面的代码
int i =0;
 for (i = 0; i < arr.length-1; i++) {
     for (int j = 0; j < arr.length-1-i; j++) {
        //可自己设置条件条件
         if(arr[j]>arr[j+1]) {
            //完成两个数字的交换
             int tmp = arr[j+1];
             arr[j+1] = arr[j];
             arr[j] = tmp;
          }
      }
  }
  • 升序的条件是第一个数大于第二个数就要交换;如果是排逆序则是第一个数小于第二个数则需要交换

3.完整代码

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

二、折半查找

1.折半查找介绍

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

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

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

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

2.查找的思路

(1)方法的参数写法

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

(2)查找的内部细节

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

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

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

  • 先看代码
public static int binarySearch(int[] arr,int k) {
        int left = 0;
        int right = arr.length-1;
        while(left <= right) {
            //从中间位置开始找
            int mid = (left+right)/2;
            if(k < arr[mid]) {//k在左边
                right=mid-1;
            } else if(k > arr[mid]) {
                //在右边
                left=mid+1;
            } else {
                return mid;
            }
        }
        return -1;
    }
  • 查找过程图解 :第一次查找

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

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

3.完整代码

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

三、逆序数组

1.逆序思路

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

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

(2)设置头尾位置

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

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

(3)循环交换数据

while(left < right) {//相等的时候就不需要逆序了
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }

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

2..完整代码

public static void main(String[] args) {
        //逆序数组
        int[] arr = {10,9,8,7,6,5,4,3,2,1,0};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void reverse(int[] arr) {
        int left = 0;
        int right =arr.length-1;
        while(left < right) {//相等的时候就不需要逆序了
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }
相关文章
|
19天前
|
Java
冒泡排序(java)
冒泡排序(java)
14 0
|
24天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
22 4
|
10天前
|
搜索推荐 C语言
C语言冒泡排序(附源码和动态图)
冒泡排序是一种简单的排序算法,其基本思想是通过重复遍历待排序的数列,比较每对相邻元素的值,如果它们的顺序错误(即满足一定的排序条件,如从小到大排序时前一个元素大于后一个元素),就交换它们的位置。这个过程就像水底的气泡一样逐渐向上冒,因此得名“冒泡排序”。
|
26天前
|
算法 Java C语言
Java中的算法与C语言中的函数
Java中的算法与C语言中的函数
20 2
|
1月前
|
存储 算法 Java
【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)
【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)
9 2
|
17天前
|
算法 搜索推荐 C语言
C语言冒泡排序介绍
C语言冒泡排序介绍
13 0
|
19天前
|
Java
图深度优先、广度优先遍历(java)
图深度优先、广度优先遍历(java)
12 0
|
23天前
|
C语言
C语言----冒泡排序
C语言----冒泡排序
13 0
|
2月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
25 1
|
1月前
|
搜索推荐 前端开发 C语言
C语言探索:冒泡排序的实现与解读
C语言探索:冒泡排序的实现与解读
20 0