递归
汉诺塔游戏
public static void main(String[] args) {while(true){System.out.println("請輸入盘子个数:");Scanner sc1=new Scanner(System.in);String str1=sc1.nextLine();System.out.println("請輸入柱子代号:");Scanner sc=new Scanner(System.in);String str=sc.nextLine();char arr[] =str.toCharArray();int i=Integer.valueOf(str1);print(i,arr[0],arr[1],arr[2]);}}/**** @param n 總共幾個盤子* @param from 開始的柱子* @param in 中間的柱子* @param to 目標柱子* @return* 无论有多少个盘子,都认为只有两个。上面的所有盘子和最下面一个盘子。*/public static void print(int n,char from,char in,char to){if(n==0){System.out.println("盘子正在准备中。。。。");//只有一个盘子}else if(n==1){System.out.println("第"+n+"个盘子从"+from+"移到"+to);//无论有多少个盘子,都认为只有两个。上面的所有盘子和最下面一个盘子。}else{//移动上面的所有盘子到中间print(n-1,from,to,in);System.out.println("第"+n+"个盘子从"+from+"移到"+to);//把上面的所有盘子从中间位置移到目标位置print(n-1,in,from,to);}}
斐波那契数列(1,1,2,3,5,8,13……..)
/**打印第N项的数列@param n 第几项*/public int Fibonacci(int n) {if(n==0){return 0;}else if(n==1 || n==2){return 1;}else{return Fibonacci(n-1)+Fibonacci(n-2);}}
排序
1. 冒泡排序:
public static void main(String[] args) {int arr[]={5,3,2,6,7,1,4,8,9};Sort bs=new Sort();System.out.println(Arrays.toString(arr));bs.bubblr(arr);System.out.println(Arrays.toString(arr));}/*** 冒泡排序* @param arr 需要排序的数组*/public void bubblr(int[] arr){//排序的轮数for (int i = 0; i < arr.length-1; i++) {//排序的次数for (int j = 0; j < arr.length-i-1; j++) {if(arr[j] > arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}
2. 快速排序:
排序过程:
5 3 2 6 7 1 4 8 9 : 取第一个为标准,第一回合从后往前找出一个标准数小的数,是4,所以将4和标准数兑换得 4 3 2 6 7 1 5 8 9:接着,从前往后找,找出一个比标准数5大的数字,是6,将5和6交换得: 4 3 2 5 7 1 6 8 9:接着,从后往前找,找出一个比标准数5小的数字,是1,将5和1交换得: 4 3 2 1 7 5 6 8 9:接着,从前往后找找,找出一个比标准数5大的数字,是7,将5和7交换得: 4 3 2 1 5 7 6 8 9 这时,比基准数小的数都在基准数前面;比基准数大的数都在基准数后面,所以本轮快排结束,剩下的就是对基准数左右两边的数列在分别进行上述步骤,直到各个区间只有一个数为止。
public static void main(String[] args) {int arr[]={5,3,2,6,7,1,4,8,9};Sort bs=new Sort();System.out.println(Arrays.toString(arr));bs.quick(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}/*** 快速排序* @param arr 需要排序的数组* @param start 开始的位置* @param end 结束的位置*/public void quick(int[] arr,int start,int end){if(start < end){//定一个标椎,将数组的第一个数字作为标准int stand =arr[start];//记录需要排序的下标int low=start;//左边的下标int high=end;//右边的下标//循环找比标准数大的数和比标准小的数while(low < high){//当一个数字比标准数字大的时候,往右排if(low < high && stand <= arr[high]){high--;}//使用右边的数字替换左边的数字arr[low]=arr[high];//当一个数字比标准数字小的时候,往左排if(low < high && arr[low] <= stand){low++;}//使用左边的数字替换右边的数字arr[high]=arr[low];}//把标准值赋给低所在的位置的元素arr[low]=stand;System.out.println(Arrays.toString(arr));//处理标准左边的数字quick(arr,start,low);//处理标准右边的数字quick(arr,low+1,end);}}
3. 插入排序:
排序过程:
5 3 2 6 7 1 4 8 9:取第二个数字为基准,将第二个和前一个比较,如果第二个小,则往前去一位,得: 3 5 2 6 7 1 4 8 9:接着下一个数字2,将2和前面的比较,大的往后走,小的往前去得: 2 3 5 6 7 1 4 8 9:再接着取下一个数字6,将6和前面的比较,大的往后走,小的往前去得: 2 3 5 6 7 1 4 8 9:再接着取下一个数字6,将6和前面的比较,大的往后走,小的往前去得: …. 1 2 3 4 5 6 7 8 9
public static void main(String[] args) {int arr[]={5,3,2,6,7,1,4,8,9};Sort bs=new Sort();System.out.println(Arrays.toString(arr));bs.insertSort(arr);System.out.println(Arrays.toString(arr));}/*** 插入排序* @param arr 要排序的数组*/public void insertSort(int[] arr){//遍历当前所有的数字,for(int i =1;i<arr.length ; i++){//如果当前的数字比前一个数字小if(arr[i] < arr[i-1]){//将当前的数字存起来int temp=arr[i];int j;//遍历当前数字前面的所有数字for(j=i-1;j>=0&&arr[j]>temp;j--){//把前一个数字赋给后一个数字arr[j+1]=arr[j];}//把临时变量(外层循环的当前元素)赋给不满足条件的后一个元素arr[j+1]=temp;}}}
4. 希尔排序:
排序过程
升序: 特点是分步长,通过减半得方式排序,步长依次减半 5 3 2 6 7 1 4 8 9: 先计算步长为4,由于是9个数字,所以分5次比较,有5和7比较,7和9比较,3和1比较,2 和4 比较,6和8比较,得: 5 1 2 6 7 3 4 8 9: 第二次步长为2,以步长为2进行排序,让5和2,2和7,7和4,4和9比较,1和6,6和3,3 和8进行比较,得: 1 2 3 4 5 6 7 8 9
public static void main(String[] args) {int arr[]={5,3,2,6,7,1,4,8,9};Sort bs=new Sort();System.out.println(Arrays.toString(arr));bs.shellSort(arr);System.out.println(Arrays.toString(arr));}/*** 希尔排序* @param arr 要排序的数组*/public void shellSort(int[] arr){int k=1;//排序次数//遍历所有步长 dfor(int d=arr.length/2;d>0;d/=2){//遍历所有元素for (int i = d; i < arr.length; i++) {//遍历本组中的所有元素for(int j =i-d;j>=0;j-=d){//如果当前元素大于加上步长后的元素if(arr[j] > arr[j+d]){int temp =arr[j];arr[j]=arr[j+d];arr[j+d] =temp;}}}System.out.println("第"+k+"次排序结果"+Arrays.toString(arr));k++;}}
5. 选择排序:
public static void main(String[] args) {int arr[]={5,3,2,6,7,1,4,8,9};Sort bs=new Sort();System.out.println(Arrays.toString(arr));bs.shellSort(arr);System.out.println(Arrays.toString(arr));}/*** 选择排序* @param arr 需要排序的数组*/public void selectSort(int[] arr){//遍历所有的数字for (int i = 0; i < arr.length; i++) {int minIndex=i;//记录最小的数字的下标//循环最小下标后面的数字for (int j = i; j < arr.length; j++) {//如果后面的数字比最小下标数字还小,就将最小数字的小标换成这个小标if(arr[minIndex] > arr[j]){//记录最小数字的下标minIndex=j;}}//如果最小下标和当前数字的小标不一致,说明下标minIndex的数比当前遍历的数更小if(minIndex != i){int temp=arr[i];arr[i]=arr[minIndex];arr[minIndex] =temp;}}}
