美文网首页Android开发程序员Linux学习之路
【Java常识】8.0 数组实现冒泡排序、选择排序和二分查找

【Java常识】8.0 数组实现冒泡排序、选择排序和二分查找

作者: bobokaka | 来源:发表于2020-01-01 23:40 被阅读0次
    1.0 冒泡排序原理

    冒泡排序就是:轻的上浮,沉的下降。小的往前排,大的往后走。
    原理:若一个N个元素的数组,两个相邻位置比较,如果前面的元素比后面的元素大就换位置。
    每一次比较,都是相对最沉的到位。比较N-1次,每一次,上次一次沉到最下面放好的不用再比较,直到所有的到位为止。

    2.0 冒泡排序代码实现
    package edp.com.learn1;
    
    public class Demo {
    
        public static void main(String[] args) {
            int[] arr = { 24, 68, 84, 55, 15 };
            bubbleSort(arr);
        }
    
        public static void bubbleSort(int[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                //外循环, N个数,只要比较N-1次就够了,最后一个数不需要比较。
                for (int j = 0; j < arr.length-1-i; j++) {
                    //-1为了防止索引越界
                    //内循环,
                    if (arr[j]>arr[j+1]) {
                        int temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1] = temp;
                    }
                }
                print(arr);
            }
        }
        
        /**
         * 打印数组的方法
         */
        public static void print(int[] arr) {
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+" ");
            }
            System.out.println();
        }
    }
    

    执行结果:


    image.png

    其中结果就是每一次排序的展示,可见1.0中描述的规律。

    3.0 选择排序的原理

    选择排序:用一个索引位置上的元素,依次与其他索引位置上的元素比较。晓得在前面,大的在后面。
    每一次排序的结果,都是最小值到相对最前面的位置。比较N-1次,每一次,上次一次浮到最前面放好的不用再比较,直到所有的到位为止。

    4.0 选择排序的代码实现

    代码示范:

    package edp.com.learn1;
    
    public class Demo {
    
        public static void main(String[] args) {
            int[] arr = { 24, 68, 84, 55, 15 };
            System.out.print("初始数组为:");
            print(arr);
            System.out.println("冒泡排序:");
            bubbleSort(arr);
            System.out.println("选择排序:");
            selectSort(arr);
        }
    
        public static void bubbleSort(int[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                // 外循环, N个数,只要比较N-1次就够了,最后一个数不需要比较。
                for (int j = 0; j < arr.length - 1 - i; j++) {
                    // -1为了防止索引越界
                    // 内循环,
                    if (arr[j] > arr[j + 1]) {
                        swap(arr, j, j + 1);
                    }
                }
                print(arr);
            }
        }
    
        /**
         ** 选择排序
         **/
        public static void selectSort(int[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                // 外循环, N个数,只要比较N-1次就够了,最后一次不需要比较。
                for (int j = i + 1; j < arr.length; j++) {
                    // 内循环,
                    if (arr[i] > arr[j]) {
                        swap(arr, i, j);
                    }
                }
                print(arr);
            }
        }
    
        /**
         ** 打印数组的方法
         */
        public static void print(int[] arr) {
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
        }
    
        /**
         ** 换位操作方法 此方法只针对本类使用,不准备其他类使用,定义为私有
         **/
        private static void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    

    执行结果为:


    image.png
    5.0 二分查找的原理

    二分查找的前提:数组元素有序。不停地折半查找直到找到该值。
    比如 11 22 33 44 55 66 77 ,需要查找到22,那么二分查找,先找44,在找22,找到,返回索引。
    画图演示如下:


    image.png
    6.0 二分查找的代码实现

    代码演示如下:

    package edp.com.learn1;
    
    public class Demo {
    
        public static void main(String[] args) {
            int[] arr = { 11, 22, 33, 44, 55, 66, 77 };
            System.out.println(getIndex(arr, 22));
            System.out.println(getIndex(arr, 66));
            System.out.println(getIndex(arr, 88));
    
        }
    
        public static int getIndex(int[] arr, int value) {
            int min = 0;
            int max = arr.length - 1;
            int mid = (min + max) / 2;
    
            while (arr[mid] != value) {          //当中间值不等于要找的值,开始循环查找。
                if (arr[mid] < value) {          //当中间值小于要查找的值。
                    min = mid + 1;               //最小的索引改变。
                } else if (arr[mid] > value) {   //当中间值大于要找的值。
                    max = mid - 1;               //最大的索引改变。
                }
                mid = (min + max) / 2;           //无论最大还是最小改变中间索引都会随之改变。
                if (min>max) {                   //如果最小索引大于最大索引。没有查找的可能性。
                    return -1;                   //返回-1,表示查找失败。
                }
            }
            return mid;
        }
    }
    

    执行结果如下:


    image.png

    END

    相关文章

      网友评论

        本文标题:【Java常识】8.0 数组实现冒泡排序、选择排序和二分查找

        本文链接:https://www.haomeiwen.com/subject/thgioctx.html