面试常见算法

面试常见算法

/**
     * 快速排序
     * 选择一个基准值,将比基准值小的放在左侧,大的放在右侧
     * 再将两侧的数组进行递归调用即可
     */
    public void quickSort(int[] numbers, int start, int end){
        if (start < end) {
            int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)
            int temp; // 记录临时中间值
            int i = start, j = end;
            do {
                while ((numbers[i] < base) && (i < end)) {
                    i++;
                }
                while ((numbers[j] > base) && (j > start)){
                    j--;
                }
                if (i <= j) {
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                    i++;
                    j--;
                }
                for (int x : numbers){
                    System.out.print(x + ",");
                }
                System.out.println("--------------------------");
            } while (i <= j);
            if (start < j) {
                quickSort(numbers, start, j);
            }
            if (end > i) {
                quickSort(numbers, i, end);
            }
        }
    }
     /**
     * 选择排序
     * 在未排序序列中找到最小元素,存放到排序序列的起始位置
     * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾
     * 以此类推,直到所有元素均排序完毕。
     */
    public void selectSort(int[] arr) {
        int temp, k, j;
        for (int i = 0; i < arr.length; i++) {
            k = i;
            for (j = arr.length - 1; j > i; j--) {
                if (arr[j] < arr[k]) {
                    k = j;    //k为当前这一趟最小的元素下标值
                }
            }
            temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
    }
/**
     * 插入排序
     * 从第一个元素开始,该元素可以认为已经被排序
     * 取出下一个元素,在已经排序的元素序列中从后向前扫描
     * 如果该元素(已排序)大于新元素,将该元素移到下一位置
     * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
     * 将新元素插入到该位置中
     * 重复步骤2
     */
    public void insertSort(int[] arr) {
        int temp, j;
        for (int i = 1; i < arr.length; i++) {
            temp = arr[i];
            for (j = i; j > 0 && temp < arr[j - 1]; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = temp;
        }
    }
 /**
     * Atoi函数实现
     * atoi() 函数会扫描 str 字符串,跳过前面的空白字符(例如空格,tab缩进等),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
     * 返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0。如果超出Integer的范围,将会返回Integer最大值或者最小值
     */
    public int myAtoi(String str) {
        if (str == null || str.length() < 0) {
            return 0;
        }
        str = str.replaceAll(" ", "");
        char flag = '+';
        int i = 0;
        if (str.charAt(0) == '-') {
            flag = '-';
            i++;
        } else if (str.charAt(0) == '+') {
            i++;
        }
        double res = 0;
        while (i < str.length() && str.charAt(i) > '0' && str.charAt(i) < '9') {
            res = res * 10 + str.charAt(i) - '0';
            i++;
        }
        if (flag == '-') {
            res = -1 * res;
        }
        if (res > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        } else if (res < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }
        return (int) res;
    }
 /**
     * 二分查找
     * 要求待查找的序列有序。
     * 每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
     * 返回key所在数组位置
     */
    public int binSearch(int[] arr, int key) {
        int mid = arr.length / 2;
        if (key == arr[mid]) {
            return mid;
        }
        int start = 0;
        int end = arr.length - 1;
        while (start < end) {
            mid = (end - start) / 2 + start;
            if (key < arr[mid]) {
                end = mid - 1;
            } else if (key > arr[mid]) {
                start = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

猜你喜欢

转载自blog.csdn.net/hanliuxi4265/article/details/86592353