JAVA入门基础_几种常见的算法(持续更新中)

几种常见的算法

常见的排序算法

冒泡排序

public class BubbleSort {
    public static void main(String[] args) {
        // 1、定义无序数组
        int[] arr = {89, 59, 44, 12, 58, 26, 94, 98, 21, 23};
//        int[] arr = {12, 21, 23, 26, 44, 58, 59, 89, 94, 98};

        // 2、输出无序数组
        System.out.println(Arrays.toString(arr));
        // 3、排序
        // 外循环,至少比较数组长度减一,因为最后一个元素无需再进行比较
        for (int i = 0; i < arr.length - 1; i++) {
            // 默认序列是有序的
            boolean flag = true;
            // 内循环,由于每次比较都会有一个最大或最小的数被放在最边缘的位置,所以每次循环时都需要对应的减少比较的次数
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    arr[j] = arr[j] ^ arr[j + 1];
                    arr[j + 1] = arr[j] ^ arr[j + 1];
                    arr[j] = arr[j] ^ arr[j + 1];
                    // 如果第一次小循环进行过交换,说明序列不是有序的,否则说明是有序的
                    flag = false;
                }
            }
            // 这么做如果数组已经是有序了,则无需继续进行比较,减少循环次数,增加效率
            if (flag) {
                break;
            }
        }

        // 4、输出排序后的数组
        System.out.println(Arrays.toString(arr));
    }
}

选择排序

class SelectSort {
    public static void main(String[] args) {
        // 1、定义无序数组
        int[] arr = {89, 59, 44, 12, 58, 26, 94, 98, 21, 23};

        // 2、输出无序数组
        System.out.println(Arrays.toString(arr));
        // 3、排序
        // 外循环,需要 n - 1的循环次数
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            // 进行交换
            if (minIndex != i) {
                int temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }

        // 4、输出排序后的数组
        System.out.println(Arrays.toString(arr));
    }
}

冒泡排序与选择排序的区别

  • 冒泡排序至多需要n-1趟循环,最少一趟循环;其中n为长度

  • 选择排序一定需要n-1躺循环,一趟也不能少

  • 冒泡排序中最多的操作就是比较和交换,一趟循环中可能发生多次交换;

  • 选择排序中最多的操作就是比较,一趟比较结束后发现更小(或更大)的值才进行交换

  • 所以更推荐使用冒泡。

二分查找(折半查找)

    /**
     * 二分查找
     * @param arrs 传入需要排序的数组(注意数组必须从小到大排序)
     * @param key 传入需要查找的数据
     * @return
     */
    public static int binarySearch(int[] arrs, int key) {
        // 1. 分别获取数组的最小下标和最大下标
        int low = 0;
        int high = arrs.length - 1;

        // 如果最小索引超过最大索引则代表没查找到对应的元素
        while (low <= high) {
            // 2. 获取到中间的索引
            int mid = (low + high) / 2;

            // 3. 如果key大于中间值,则将最小索引调整至 mid + 1
            if(key > arrs[mid]){
                low = mid + 1;
                // 4. 如果key小于中间值,则将最大索引调整至 mid - 1
            }else if(key < arrs[mid]) {
                high = mid - 1;
            }else {
                // 5. 这个时候代表key == arrs[mid]
                return mid;
            }
        }
        // 没找到,返回-1
        return -1;
    }
posted @ 2022-08-01 15:13  CodeStars  阅读(114)  评论(0编辑  收藏  举报