算法与设计学习过程
坚持更新(使用JAVA语言)
递归:实现汉诺塔问题
1 | public class Hannota { |
2 | public static void main(String[] args) { |
3 | int N = 3; |
4 | Hanoi('A', 'B', 'C', N); //使用 |
5 | } |
6 | public static void Hanoi(char from, char inter, char to, int N) { //方法 |
7 | if (N == 1){ |
8 | System.out.println("移动 1 从 "+ from + " 到 " + to); //只有一个的情况下 |
9 | }else { |
10 | Hanoi( from, to, inter, N - 1); |
11 | System.out.println("移动 " + N + " 从 " + from + " 到 " + to); |
12 | Hanoi( inter, from, to, N - 1); |
13 | } |
14 | } |
15 | } |
递归:实现排序问题
1 | public class Sort { |
2 | public static int S[] = new int[]{1,2,3}; //定义一个数组s{1,2,3} |
3 | public static void main(String[] args) { |
4 | perm(S,0,S.length-1); |
5 | } |
6 | private static void swap(int i1, int i2) { |
7 | int temp = S[i2]; |
8 | S[i2] = S[i1]; |
9 | S[i1] = temp; |
10 | } |
11 | public static void perm(int arr[], int begin,int end) { |
12 | if(end==begin){ //一到递归的出口就输出数组,此数组为全排列 |
13 | for(int i=0;i<=end;i++){ |
14 | System.out.print(arr[i]+" "); |
15 | } |
16 | System.out.println(); |
17 | return; |
18 | } |
19 | |
20 | else{ |
21 | for(int j=begin;j<=end;j++){ |
22 | swap(begin,j); //for循环将begin~end中的每个数放到begin位置中去 |
23 | perm(arr,begin+1,end); //假设begin位置确定,那么对begin+1~end中的数继续递归 //递归 |
24 | swap(begin,j); //换过去后再还原 |
25 | } |
26 | } |
27 | } |
28 | } |
分治:递归实现的快速排序
1 | public class Quicksort { |
2 | |
3 | /** |
4 | * @param args |
5 | */ |
6 | public static void main(String[] args) { |
7 | int[] src = {7, 9, 2, 3, 6, 5, 4, 1, 8, 10}; |
8 | System.out.print("原数组为:"); |
9 | for (int i : src) { |
10 | System.out.print(" " + i); |
11 | |
12 | } |
13 | System.out.print("\n"); |
14 | quickSort(src); |
15 | System.out.print("现数组为:"); |
16 | for (int i : src) { |
17 | System.out.print(" " + i); |
18 | } |
19 | } |
20 | |
21 | /** |
22 | * 对整个源数组进行快速排序 |
23 | * @param src |
24 | * @return |
25 | */ |
26 | public static void quickSort(int[] src) { |
27 | sortPartision(src, 0, src.length - 1); |
28 | } |
29 | |
30 | /** |
31 | * 排序分治区域 |
32 | * @param src |
33 | * @param start |
34 | * @param end |
35 | */ |
36 | |
37 | private static void sortPartision(int[] src, int start, int end) { |
38 | int i = start; //将开始赋值给i |
39 | int r = end; //将结尾赋值给r |
40 | int x = src[i]; |
41 | while (i < r) { |
42 | while (i < r && src[r] > x) { |
43 | r--; |
44 | } |
45 | if (src[r] < x) { |
46 | src[i] = src[r]; |
47 | i++; |
48 | } |
49 | while (i < r && src[i] < x) { |
50 | i++; |
51 | } |
52 | if (src[i] > x) { |
53 | src[r] = src[i]; |
54 | r--; |
55 | } |
56 | } |
57 | src[i] = x; |
58 | int I = i; |
59 | if (I > start) { |
60 | sortPartision(src, start, I-1); |
61 | } |
62 | if (I < end) { |
63 | sortPartision(src, I+1, end); |
64 | } |
65 | } |
66 | } |
分治:递归实现的合并排序
1 | public class Mergesort { |
2 | static int arr[] = {100, 20, 15, 30, 5, 75, 40, 12, 514}; //定义排序前的一个是数组 |
3 | public static void main(String args[]) { |
4 | System.out.println("数据排序之前 : "); |
5 | // 排序前打印数组 |
6 | printArray(arr, 0, arr.length - 1); |
7 | System.out.println("-----------------------------"); |
8 | |
9 | // 用递归实现排序 |
10 | mergeSort(0, arr.length - 1); |
11 | |
12 | System.out.println("-----------------------------"); |
13 | |
14 | // 排序后打印数组 |
15 | System.out.println("排序后打印数组:"); |
16 | printArray(arr, 0, arr.length - 1); |
17 | } |
18 | /** |
19 | * 用于合并排序的递归算法 |
20 | * |
21 | * @param start |
22 | * @param end |
23 | */ |
24 | public static void mergeSort(int start, int end) { |
25 | int mid = (start + end) / 2; |
26 | if (start < end) { |
27 | // 排序左半部分 |
28 | mergeSort(start, mid); |
29 | // 排序右半部分 |
30 | mergeSort(mid + 1, end); |
31 | // 合并左右两半 |
32 | merge(start, mid, end); |
33 | } |
34 | |
35 | } |
36 | /** |
37 | * @param start |
38 | * @param mid |
39 | * @param end |
40 | */ |
41 | private static void merge(int start, int mid, int end) { |
42 | // 初始化临时数组和索引 |
43 | int[] tempArray = new int[arr.length]; |
44 | int tempArrayIndex = start; |
45 | System.out.print("合并前: "); |
46 | printArray(arr, start, end); |
47 | int startIndex = start; |
48 | int midIndex = mid + 1; |
49 | // 它将迭代直到较小的列表到达结尾 |
50 | while (startIndex <= mid && midIndex <= end) { |
51 | if (arr[startIndex] < arr[midIndex]) { |
52 | tempArray[tempArrayIndex++] = arr[startIndex++]; |
53 | } else { |
54 | tempArray[tempArrayIndex++] = arr[midIndex++]; |
55 | } |
56 | } |
57 | // 复制剩余的元素 |
58 | while (startIndex <= mid) { |
59 | tempArray[tempArrayIndex++] = arr[startIndex++]; |
60 | } |
61 | while (midIndex <= end) { |
62 | tempArray[tempArrayIndex++] = arr[midIndex++]; |
63 | } |
64 | // 排序后将tempArray复制到实际数组 |
65 | for (int i = start; i <= end; i++) { |
66 | arr[i] = tempArray[i]; |
67 | } |
68 | System.out.print("合并后: "); |
69 | printArray(tempArray, start, end); |
70 | System.out.println(); |
71 | } |
72 | /** |
73 | * 打印数组 |
74 | * |
75 | * @param arr 传入的数组 |
76 | * @param start 遍历开始的位置 |
77 | * @param end 遍历结束的位置 |
78 | */ |
79 | public static void printArray(int arr[], int start, int end) { |
80 | for (int i = start; i <= end; i++) |
81 | { |
82 | System.out.print(arr[i] + " "); |
83 | } |
84 | System.out.println(); |
85 | } |
86 | } |