-Chapter1
1.1 Haistone
package Chap1;
import java.util.Scanner;
public class Hailstone {
private static Scanner s;
public static void main (String[] args) {
int len = 1;
System.out.println("Please input a int number:");
s = new Scanner(System.in);
int n = s.nextInt();
while(n>1) {
if(n%2==0)
n = n/2;
else
n = 3*n+1;
len++;
}
System.out.println(len);
}
}
1.2 冒泡排序
使用sorted标记法,可以不需要运行n^2次,时间复杂度O(n2)。
package Chap1;
import java.util.Arrays;
public class OOOrder
{
public static void main(String[] args)
{
int[] dt = new int[] {9,5,63,20,4,88,72};
int[] b;
b = OOOrder.data(dt);
System.out.println("----"+Arrays.toString(b));
}
public static int[] data(int[] A)
{
int cup1;
int n = A.length;
for(boolean sorted = false; sorted =!sorted; n--)
{
System.out.println(n+":"+Arrays.toString(A));
for (int i =1; i<n;i++)
{
if(A[i-1]>A[i])
{
cup1 = A[i];
A[i] = A[i-1];
A[i-1] =cup1;
sorted = false;
}
}
}
return A;
}
}
1.3实现数组加和-递归法
使用断点调试,可以看清楚每一步发生了什么。逐步sum,之后再逐步返回,直到达到第一层的return。时间复杂度O(n)。
package Chap1;
//import java.util.Arrays;
public class Sumdataset {
public static int sumint(int[] A,int n) {
//System.out.println(Arrays.toString(A));
return (n<1)? 0: (sumint(A,n-1)+A[n-1]);
}
public static void main(String[] args){
int[] A = new int[] {21,1,3,6};
int n = A.length;
System.out.println(sumint(A,n));
}
}
1.4 调换数组顺序-递归
package Chap1;
import java.util.Arrays;
public class Swampdt {
public static void swampdt(int[] A,int lo,int hi) {
if (lo<hi) {
int c;
c=A[hi];
A[hi]=A[lo];
A[lo]=c;
swampdt(A,lo+1,hi-1);
}
}
public static void main(String[] args) {
int[] A = new int[] {12,2,4,3};
System.out.println(Arrays.toString(A));
int lo = 0;
int hi = A.length-1;
swampdt(A,lo,hi);
System.out.println(Arrays.toString(A));
}
}
1.5 数组加和-二分递归
时间复杂度O(n).
package Chap1;
public class binarysum {
public static void main(String[] args) {
int[] A = new int[]{1,4,6,23,11};
int a = bsum(A,0,4);
System.out.println(a);
}
public static int bsum(int[] A,int lo,int hi) {
if(lo == hi)
return A[lo];
int mi = (lo+hi)>>1;
return bsum(A,lo,mi)+bsum(A,mi+1,hi);
}
}
1.6 找出数组中最大的两个元素-递归+分治法
由于Java没有指针,所以使用了对象引用的方法实现类似于指针的操作。
package Chap1;
import java.util.Arrays;
public class Max2 {
public static void main(String[] args) {
int[] A = new int[] {12,33,65,99,67,35,998,781,9980};
int[] B = new int[2];
max2(A,0,A.length,B);
System.out.println(Arrays.toString(B));
}
public static void max2(int[] A ,int lo,int hi,int[] B)
{
if(lo+2 ==hi) {
if(A[lo]>A[lo+1]) {
B[0] = lo;
B[1] = lo+1;
}else {
B[0] = lo+1;
B[1] = lo;
}
return;
}
if(lo+3 ==hi) {
if(A[lo]>A[lo+1]) {
if(A[lo]>A[lo+2]) {
B[0] = lo;
if(A[lo+1]>A[lo+2])
B[1] = lo+1;
else
B[1] = lo+2;
}else {
B[0] = lo+2;
if(A[lo]>A[lo+1])
B[1] = lo;
else
B[1] = lo+1;
}
}else {
if(A[lo+1]>A[lo+2]) {
B[0] = lo+1;
if(A[lo+2]>A[lo])
B[1] = lo+2;
else
B[1] = lo;
}else {
B[0] =lo+2;
if(A[lo]>A[lo+1])
B[1] = lo;
else
B[1] = lo+1;
}
}
return;
}
int m = (lo+hi)>>1;
int[] B1 = new int[2];
max2(A,lo,m,B1);
int[] B2 = new int[2];
max2(A,m,hi,B2);
if(A[B1[0]]>A[B2[0]]) {
B[0] = B1[0];
B[1] = (A[B1[1]]>A[B2[0]])?B1[1]:B2[0];
}
else
{
B[0] = B2[0];
B[1] = (A[B2[1]]>A[B1[0]])?B2[1]:B1[0];
}
}
}