二分查和快速排序

2019-11-18  本文已影响0人  一直想上树的猪

一、二分查

package com.tinner.algorithm;

import sun.util.resources.cldr.eu.LocaleNames_eu;

import javax.swing.tree.FixedHeightLayoutCache;

/**
 * @author Tinner
 * @date 2019-11-17
 * @Description 二分查找
 */
public class BinarySearch {

    /**
     * 使用递归完成二分查找
     *
     * @param arr   有序数组
     * @param key   待查找关键字
     * @param low
     * @param hight
     * @return 找到的位置
     */
    public static int recursionBinarySearch(int[] arr, int key, int low, int hight) {
        if (key < arr[low] || key > arr[hight] || low > hight) {
            return -1;
        }
        int middle = (low + hight) / 2;
        if (arr[middle] > key) {
            return recursionBinarySearch(arr, key, low, middle - 1);
        } else if (arr[middle] < key) {
            return recursionBinarySearch(arr, key, middle + 1, hight);
        } else {
            return middle;
        }
    }


    /**
     * 不使用递归完成二分查找
     *
     * @param arr 有序数组
     * @param key 待查找关键字
     * @return 找到的位置
     */
    public static int commonBinarySearch(int[] arr, int key) {
        int low = 0;
        int hight = arr.length - 1;
        int middle = 0;
        if (key < arr[low] || key > arr[hight] ||low > hight ) {
            return -1;
        }
        while (low <= hight) {
            middle = (low + hight) / 2;
            if (arr[middle] > key) {
                hight = middle - 1;
            } else if (arr[middle] < key) {
                low = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }

    public static void main(String[] args) {

        int[] arr = {1, 3, 5, 7, 9, 11};
        int key = 9;
        int position = recursionBinarySearch(arr,key,0,arr.length - 1);

//        int position = recursionBinarySearch(arr, key);

        if (position == -1) {
            System.out.println("查找的是" + key + ",序列中没有该数!");
        } else {
            System.out.println("查找的是" + key + ",找到位置为:" + position);
        }
    }
}

二、快速排序

package com.tinner.algorithm;

import java.util.Arrays;

/**
 * @author Tinner
 * @date 2019-11-17
 * @Description 快速排序
 */
public class QuickSort {

    //记录循环个数
    private static int count;

    public static void main(String[] args) {
        int[] nums = new int[]{
                7, 1, 3, 5, 13, 9, 3, 6, 11
//                7,1,5,3,13,9,6
        };
        System.out.println("数组初始化为:" + Arrays.toString(nums));
        sort(nums, 0, nums.length - 1);
        System.out.println("经过快排之后:" + Arrays.toString(nums));
        System.out.println("循环的次数为:" + count);

    }


    public static void sort(int[] array, int left, int right) {
        if(left > right) {
            return;
        }
        // base中存放基准数
        int base = array[left];
        int i = left, j = right;
        while(i != j) {
            // 顺序很重要,先从右边开始往左找,直到找到比base值小的数
            while(array[j] >= base && i < j) {
                j--;
            }

            // 再从左往右边找,直到找到比base值大的数
            while(array[i] <= base && i < j) {
                i++;
            }

            // 上面的循环结束表示找到了位置或者(i>=j)了,交换两个数在数组中的位置
            if(i < j) {
                int tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }

        // 将基准数放到中间的位置(基准数归位)
        array[left] = array[i];
        array[i] = base;
        count++;
        // 递归,继续向基准的左右两边执行和上面同样的操作
        // i的索引处为上面已确定好的基准值的位置,无需再处理
        sort(array, left, i - 1);
        sort(array, i + 1, right);
    }
}

上一篇下一篇

猜你喜欢

热点阅读