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 voidmain(String[] args) {for (int i = 1; i <= 20; i++)

System.out.println("第" + i + "个月:" +function(i));

}private static int function(intx) {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 voidmain(String[] args) {

System.out.println(function(10));

}private static int function(intn) {if (n <= 2) {returnn;

}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 voidmain(String[] args) {for (int i = 1; i <= 200; i++) {if(function(i)) {

System.out.println("素数:" +i);

}

}

}private static boolean function(intx) {for (int i = 2; i <= x / 2; i++) {if (x % i == 0) {return false;

}

}return true;

}

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

public static voidmain(String[] args) {for (int i = 1; i <= 999; i++) {if(function(i)) {

System.out.println("水仙花数:" +i);

}

}

}private static boolean function(intx) {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 voidmain(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, intkey) {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]

start= mid + 1;

}

}return -1;

}

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

public static voidmain(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, inthight) {inti, 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

a[i++] = a[j];//用比基准小的记录替换低位记录

while (i < j && a[i]

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, intj) {inttmp;

tmp=a[i];

a[i]=a[j];

a[j]=tmp;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值