第1节.pptx
1 排序算法
题目1 选择排序

     /**     * 选择排序     */    public static void selectSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }        /*        * 0~N-1        * 1~N-1        * 2~N-1        */        for (int i = 0; i < arr.length - 1; i++) {            int minIndex = i;            // 找到最小值的数组下标,和第一个数做交换            for (int j = i + 1; j < arr.length; j++) {                minIndex = arr[minIndex] < arr[j] ? minIndex : j;            }            swap(arr, i, minIndex);        }    }    /**     * 交换数组两个下标的数     */    public static void swap(int[] arr, int i, int j) {        int temp = arr[i];        arr[i] = arr[j];        arr[j] = temp;    }
题目2 冒泡排序

     /**     * 冒泡排序     *     * @param arr 数组     */    public static void bubbleSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }        /*         * 0~N-1         * 0~N-2         * 0~N-3         * ...         * 0~1         * */        for (int i = arr.length - 1; i > 0; i--) {            for (int j = 0; j < i; j++) {                if (arr[j] > arr[j + 1]) {                    swap(arr, j, j + 1);                }            }        }    }    /**     * 交换数组两个下标的数     * 两个下标不指向同一块内存空间,可使用不增加变量的方式交换     */    public static void swap(int[] arr, int i, int j) {        arr[i] = arr[i] ^ arr[j];        arr[j] = arr[i] ^ arr[j];        arr[i] = arr[i] ^ arr[j];    }
题目3 插入排序

    /**     * 插入排序     *     * @param arr 数组     */    public static void insertSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }        for (int i = 1; i < arr.length; i++) {            for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {                swap(arr, j, j - 1);            }        }    }    /**     * 交换数组两个下标的数     * 两个下标不指向同一块内存空间,可使用不增加变量的方式交换     */    public static void swap(int[] arr, int i, int j) {        arr[i] = arr[i] ^ arr[j];        arr[j] = arr[i] ^ arr[j];        arr[i] = arr[i] ^ arr[j];    }
题目4 希尔排序——改进的插入排序

 public static void shellSort(int[] arr) {    if (arr == null || arr.length < 2) {        return;    }    int h = 1;    while (h <= arr.length / 3) {        h = 3 * h + 1;    }    for (int gap = h; gap > 0; gap = (gap - 1) / 3) {        for (int i = gap; i < arr.length; i++) {            for (int j = i; j > gap - 1 && arr[j] < arr[j - gap]; j -= gap) {                swap(arr, j, j - gap);            }        }    }}
4 二分法应用
题目1:在一个有序数组中,找某个数是否存在

    /**     * 有序数组,二分查找一个数是否存在,返回数的下标     * @param arr 数组     * @param num 数     * @return 下标,不存在返回-1     */    public static int binarySearch(int[] arr, int num) {        if (arr == null || arr.length < 1) {            return -1;        }        int left = 0;        int right = arr.length - 1;        while (left <= right) {            int mid = left + ((right - left) >> 1);            if (arr[mid] == num) {                return mid;            } else if (arr[mid] < num) {                left = mid + 1;            } else {                right = mid - 1;            }        }        return -1;    }
题目2:在一个有序数组中,找>=某个数最左侧的位置

     /**     * 在一个有序数组中,找>=某个数最左侧的位置     *     * @param arr     * @param num     * @return     */    public static int binarySearchNearLeft(int[] arr, int num) {        if (arr == null || arr.length < 1) {            return -1;        }        int index = -1;        int left = 0;        int right = arr.length - 1;        while (left <= right) {            int mid = left + ((right - left) >> 1);            if (arr[mid] >= num) {                index = mid;                right = mid - 1;            } else {                left = mid + 1;            }        }        return index;    }
题目3:局部最小值问题

    /**     * 局部最小值问题     *     * @param arr 随机数组,满足相邻2个数不相等     * @return 任意一个局部最小值     */    public static int binarySearchAwesome(int[] arr) {        if (arr == null || arr.length < 1) {            return -1;        }        if (arr.length == 1 || arr[0] < arr[1]) {            return 0;        }        if (arr[arr.length - 1] < arr[arr.length - 2]) {            return arr.length - 1;        }        int index = -1;        int left = 0;        int right = arr.length - 1;        while (left <= right) {            int mid = left + ((right - left) >> 1);            if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {                index = mid;                break;            } else if (arr[mid] > arr[mid - 1]) {                right = mid;            } else {                left = mid;            }        }        return index;    }