zoukankan      html  css  js  c++  java
  • Java常见算法整理

    • 兔子问题(斐波那契数列规律)
    • 台阶问题 (兔子问题变种,递归规律)
    • 素数问题(判断素数、质数方式)
    • 水仙花数问题(数字分解)
    • 查找算法(二分查找)
    • 排序算法(选择排序,冒泡排序,快速排序)

    兔子问题,重点是找到规律

    斐波那契数列 1、1、2、3、5、8、13、21、34、55

    规律为:F(n)=F(n-1)+F(n-2)(n>2,n∈N*)

        public static void main(String[] args) {for (int i = 1; i <= 20; i++)
                System.out.println("第" + i + "个月:" + function(i));
        }
    
        private static int function(int x) {
            if (x == 1 || x == 2)
                return 1;
            else
                return function(x - 1) + function(x - 2);
        }

    台阶问题:有n步台阶,一次只能上1步或2步,共有多少种走法?

    规律为:F(n)=F(n-1)+F(n-2)

        public static void main(String[] args) {
            System.out.println(function(10));
        }
    
        private static int function(int n) {
            if (n <= 2) {
                return n;
            }
            return function(n - 1) + function(n - 2);
    
        }

    判断素数(质数),重点是记住判断方式。

    判断number是否是素数有这么几种方法:
    (1)用2至number-1之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.
    (2)用2至number/2之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.
    (3)用2至number的平方根之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.

        public static void main(String[] args) {
            for (int i = 1; i <= 200; i++) {
                if (function(i)) {
                    System.out.println("素数:" + i);
                }
            }
        }
    
        private static boolean function(int x) {
    
            for (int i = 2; i <= x / 2; i++) {
                if (x % i == 0) {
                    return false;
                }
            }
            return true;
        }

    水仙花数,重点是分解百位、十位、个位。

    public static void main(String[] args) {
            for (int i = 1; i <= 999; i++) {
                if (function(i)) {
                    System.out.println("水仙花数:" + i);
                }
            }
        }
    
        private static boolean function(int x) {
    
            int i = 0, j = 0, k = 0;
    
            i = x / 100;
    
            j = (x % 100) / 10;
    
            k = x % 10;
    
            if (x == i * i * i + j * j * j + k * k * k)
    
                return true;
    
            else
    
                return false;
        }

    查找算法(二分查找)

    对于二分查找算法要求, 查找前的数据必须是已经排好序的, 然后得到数组的开始位置start和结束位置end, 取中间位置mid的数据a[mid]跟待查找数据key进行比较, 若 a[mid] > key, 则取end = mid - 1; 若 a[mid] < key, 则取start = mid + 1; 若 a[mid] = key 则直接返回当前mid为查找到的位置. 依次遍历直到找到数据或者最终没有该条数据.

        public static void main(String[] args) {
    
            int[] nums = new int[] { 1, 3, 5, 7, 9, 11, 13, 17 };
    
            System.out.println(function(nums, 5));
        }
    
        private static int function(int[] nums, int key) {
    
            int start = 0;
            int end = nums.length - 1;
            int mid = -1;
            while (start <= end) {
                mid = (start + end) / 2;
                if (nums[mid] == key) {
                    return mid;// 已经查到返回!
                } else if (nums[mid] > key) {
                    end = mid - 1;
                } else if (nums[mid] < key) {
                    start = mid + 1;
                }
            }
            return -1;
        }

    选择排序,冒泡排序,快速排序

    public static void main(String[] args) {
    
            int[] nums = new int[] { 6, 3, 8, 2, 9, 1 };
    
            bubbleSort(nums);
    
            System.out.println("bubbleSort:" + Arrays.toString(nums));
    
            //
    
            nums = new int[] { 6, 3, 8, 2, 9, 1 };
    
            QuickSort(nums, 0, nums.length - 1);
    
            System.out.println("QuickSort:" + Arrays.toString(nums));
            
            //
    
            nums = new int[] { 6, 3, 8, 2, 9, 1 };
    
            ChoiceSort(nums);
    
            System.out.println("ChoiceSort:" + Arrays.toString(nums));
    
        }
    
        // 冒泡排序
        public static void bubbleSort(int[] a) {
            int len = a.length;
            for (int i = 0; i < len - 1; i++) {
                for (int j = 0; j < len - 1 - i; j++) {
                    if (a[j] > a[j + 1]) {
                        swap(a, j + 1, j);
                    }
                }
            }
    
        }
    
        // 快速排序
        public static void QuickSort(int a[], int low, int hight) {
            int i, j, index;
            if (low > hight) {
                return;
            }
            i = low;
            j = hight;
            index = a[i]; // 用子表的第一个记录做基准
            while (i < j) { // 从表的两端交替向中间扫描
                while (i < j && a[j] >= index)
                    j--;
                if (i < j)
                    a[i++] = a[j];// 用比基准小的记录替换低位记录
                while (i < j && a[i] < index)
                    i++;
                if (i < j) // 用比基准大的记录替换高位记录
                    a[j--] = a[i];
            }
            a[i] = index;// 将基准数值替换回 a[i]
            QuickSort(a, low, i - 1); // 对低子表进行递归排序
            QuickSort(a, i + 1, hight); // 对高子表进行递归排序
    
        }
    
        // 选择排序
        public static void ChoiceSort(int[] a) {
            for (int i = 0; i < a.length; i++) {
                int min = i;
    
                for (int j = i + 1; j < a.length; j++) {
                    if (a[min] > a[j]) {
                        min = j;
                    }
                }
                if (i != min) {
                    int tmp = a[min];
                    a[min] = a[i];
                    a[i] = tmp;
                }
            }
        }
    
        // 交换元素
        private static void swap(int[] a, int i, int j) {
            int tmp;
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
  • 相关阅读:
    Java开发必会的Linux命令
    为什么跳槽加薪会比内部调薪要高?
    程序员跳槽的最佳时机选择
    推荐!国外程序员整理的Java资源大全
    JavaScript最全编码规范
    window.open子窗口获取父窗口的值
    js获取iframe中的元素
    js数组合并为一个字符串
    js中for循环(原生js)
    js字符串截取为数组
  • 原文地址:https://www.cnblogs.com/javapath/p/7326624.html
Copyright © 2011-2022 走看看