算法设计-java实现

时间:2022-10-08 11:00:45

这是用java实现的排序

Code:/***            冒泡排序程序*            @author:彭城基*            @创建时间:2010-09-12*/
  1. package sort_algorithm;  
  2.   
  3. public class MaoPao {  
  4.       
  5.     public static int[] sort(int a[]){//排序静态函数,实现排序功能  
  6.         int len = a.length;//获得数组长度  
  7.         int temp;//临时变量,用于交换值  
  8.         for (int i = 0; i < len-1; i++){//通过循环实现主要算法  
  9.             for (int j = 0; j < len-1-i; j++){  
  10.                 if (a[j+1] > a[j]){//如果后一下值比前一个值大,则交换两个值的大小,  
  11.                     temp = a[j+1];  //很显然是从大到小排序  
  12.                     a[j+1] = a[j];  
  13.                     a[j] = temp;  
  14.                 }  
  15.             }  
  16.         }  
  17.         return a;  
  18.     }  
  19.       
  20.     public static void print (int a[]){//打印输出数组  
  21.         int len = a.length;  
  22.         for (int i = 0; i < len; i++){  
  23.             System.out.print(a[i] + "、");  
  24.         }  
  25.     }  
  26.       
  27.     public static void main (String[] args){  //主方法
  28.         int a[] = {2,1,5,7,3,9,4,8};  //定义一个测试数组
  29.         System.out.println ("排序前");  
  30.         print (a);  
  31.         a = sort (a);  
  32.         System.out.println ("/n排序后");  
  33.         print (a);  
  34.     }  
  35. }  

插入排序

Code:/**           插入排序程序*            @author:彭城基*            @创建时间:2010-09-12*/
  1. package sort_algorithm;  
  2.   
  3. public class InsertSort {  
  4.       
  5.     public static int[] sort(int a[]){//排序静态函数,实现排序功能  
  6.         int len = a.length;//获得数组长度  
  7.         int key;  
  8.         int i = 0;  
  9.         for (int j = 1 ; j < len ; j++){  
  10.             key = a[j] ;  
  11.             i = j - 1 ;  
  12.             while (i > -1 && a[i] > key){  
  13.                 a[i+1] = a[i] ;  
  14.                 i = i - 1 ;  
  15.             }  
  16.             a[i+1] = key ;  
  17.         }  
  18.         return a;  
  19.     }  
  20.       
  21.     public static void print (int a[]){//打印输出数组  
  22.         int len = a.length;  
  23.         for (int i = 0; i < len; i++){  
  24.             System.out.print(a[i] + "、");  
  25.         }  
  26.     }  
  27.       
  28.     public static void main (String[] args){  
  29.         int a[] = {2,1,5,7,3,9,4,8,6,10};  
  30.         System.out.println ("排序前");  
  31.         print (a);  
  32.         a = sort (a);  
  33.         System.out.println ("/n排序后");  
  34.         print (a);  
  35.     }  
  36. }  

动态生成数组和生成一定范围的随机数

Code:/**           动态生成数组和生成一定范围的随机数程序*            @author:彭城基*            @创建时间:2010-09-12*/
  1. package sort_algorithm;  
  2.   
  3. import java.util.Random ;  
  4. public class GenerateRand {  
  5.     //  
  6.     public static boolean generateRand(int[] tempArray, int num, int max, int min){  
  7.         Random random = new Random();  
  8.         if (num < 0 || min > max){//如果数组大小不满足或者小的数反而大于大的数,则返回false不做任何操作  
  9.             return false ;  
  10.         }else {  
  11.             for (int i = 0; i < num; i++){  
  12.                 //关键代码:生成随机数  
  13.                 int rand = (int) (min + random.nextInt(max-min));  
  14.                 tempArray[i] = rand;  
  15.             }  
  16.             return true ;  
  17.         }  
  18.           
  19.     }  
  20.       
  21.     public static void print (int[] a){  
  22.         int len = a.length;    //得到数组长度  
  23.         for (int i = 0; i < len; i++){  
  24.             System.out.print(a[i] + "、");//打印数组元素  
  25.             if ((i+1)%20 == 0 && i != 0){//每20个数换行一次  
  26.                 System.out.print("/n");  
  27.             }  
  28.         }  
  29.     }  
  30.     public static void main (String[] args){  
  31.         int num=1000,max=150,min=30//生成num个大于30,小于150的随机数  
  32.         int[] tempArray = new int[num]; //动态生成数组  
  33.         if (generateRand (tempArray, num, max, min)){  
  34.             System.out.print("生成的随机数如下:/n");  
  35.             print (tempArray);  
  36.         }  
  37.     }  
  38. }  

 汉诺塔问题

Code:/**           Hanoi塔问题*            @author:彭城基*            @创建时间:2010-09-12*/
  1. public class Hanoi {  
  2.     public static void hanoi(int n, char a, char b, char c){  
  3.         if (n == 1){  
  4.             System.out.println("盘子" + n + "从 " + a + "移动到" + b );  
  5.         }else {  
  6.             hanoi (n-1, a, c, b);  
  7.             System.out.println("盘子" + n + "从 " + a + "移动到" + b );  
  8.             hanoi (n-1, c, b, a);  
  9.         }  
  10.     }   
  11.     public static void main (String[] args){  
  12.         int n = Integer.parseInt(args[0]);  
  13.         hanoi(n, 'A''B''C');  
  14.     }  
  15. }  

100~999的 水仙花数

Code:
  1. /* 
  2.  * 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数, 
  3.  * 其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ", 
  4.  * 因为153=1的三次方+5的三次方+3的三次方。 
  5.  * 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。    
  6. */  
  7.   
  8. package com.cheng.peng;  
  9. public class ShuiXianHua {  
  10.       
  11.     public static void main (String[] args){  
  12.         int[] a = new int[3];   
  13.         int temp = 0;  
  14.         for (int i = 100; i <= 999; i++){  
  15.              a[0] = i % 10 ;  //保存了3位数的个位  
  16.              a[1] = i / 10 % 10;   //保存了3位数的十位  
  17.              a[2] = i /100 ;    //保存了3位数的百位  
  18.              temp = count (a[0]) + count (a[1]) + count (a[2]);  
  19.              if (i == temp){  
  20.                  System.out.print (i + "/t");  
  21.              }  
  22.         }  
  23.     }  
  24.   
  25.     public static int count (int n){  
  26.         return (n*n*n);  
  27.     }  
  28. }  

 求100~200的素数

Code:
  1. /* 
  2. *   题目:判断101-200之间有多少个素数,并输出所有素数。    
  3. *   1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,    
  4. *   则表明此数不是素数,反之是素数。    
  5. */  
  6.   
  7. package com.cheng.peng;  
  8.   
  9. public class Prime{  
  10.   
  11.     private static int j;  
  12.   
  13.     public static void main (String[] args){  
  14.         for (int i = 101; i <= 199 ; i++){  
  15.             for (j = 2; j <= (int)Math.sqrt (i); j++){  
  16.                 if ((i % j) !=0){  
  17.                     continue;  
  18.                 }else {  
  19.                     break;  
  20.                 }  
  21.             }  
  22.             if (j > (int)Math.sqrt (i)){  
  23.                     System.out.print (i + "/t");  
  24.             }  
  25.         }  
  26.     }  
  27. }  

 (a> b)?a:b练习

Code:
  1. /* 
  2. *   题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之 
  3. *   间的用B表示,60分以下的用C表示。    
  4. *   1.程序分析:(a> b)?a:b这是条件运算符的基本例子。 
  5. * 
  6. */  
  7.   
  8. package com.cheng.peng;  
  9.   
  10. public class If_Else{  
  11.   
  12.     public static void main (String[] args){  
  13.         int n = Integer.parseInt (args[0]);  
  14.         System.out.print ( n >= 90 ? "A" : ( n < 60 ? "C":"B" ) );  
  15.     }  
  16. }  

 统计一行字符串中 数字,字母,其他字符,空格的个数

Code:
  1. //这道程序有错  
  2. /* 
  3. *   题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。    
  4. *   1.程序分析:利用while语句,条件为输入的字符不为 '/n '.   
  5. * 
  6. */  
  7.   
  8. package com.cheng.peng;  
  9.   
  10. public class Statistics{  
  11.   
  12.     public static void main (String[] args){  
  13.         int[] a = new int[4] ;  
  14.         int i = 0 ;  
  15.         StringBuffer sb = new StringBuffer() ;  
  16.         for (int j = 0; j < args.length; j++){  
  17.              sb.append (args[j]+" ") ;  
  18.         }  
  19.         while (sb.charAt (i) != '/n' && i < sb.length()-1){  
  20.             if ( 'a' <= sb.charAt (i) && sb.charAt (i) <= 'z' ||   
  21.                 'A' <= sb.charAt (i) && sb.charAt (i) <= 'Z'){  
  22.   
  23.                 a[0]++ ;  
  24.             }else if (sb.charAt (i) == ' '){  
  25.                 a[1]++ ;  
  26.             }else if ('0' <= sb.charAt (i) && sb.charAt (i) <= '9'){  
  27.                 a[2]++ ;  
  28.             }else {  
  29.                 a[3]++ ;  
  30.             }  
  31.             i++ ;  
  32.         }  
  33.         System.out.println ("字母数有:" + a[0]);  
  34.         System.out.println ("空格数有:" + a[1]);  
  35.         System.out.println ("数字有:" + a[2]);  
  36.         System.out.println ("其他字符有:" + a[3]);  
  37.     }  
  38. }  

二分查找一个任意随机生成数列的程序(满足随机生成一定数目的数列,实现排序功能,进行二分查找任意一个数,如果不存在返回-1,存在返回数列中的位置,并记录程序执行的次数)

Code:
  1. /** 
  2. *            插入排序程序 
  3. *            @author:彭城基 
  4. *            @创建时间:2010-09-20 
  5. */  
  6. package sort_algorithm ;  
  7.   
  8. import java.util.* ;    
  9. import java.io.* ;  
  10.   
  11. public class BinarySearch {  
  12.   
  13.      static int[] n = new int[1];    //保存在二分查找中,查找关键字的次数  
  14.   
  15.     public static boolean generateRand(int[] tempArray, int num, int max, int min){    
  16.    
  17.         Random random = new Random();     
  18.   
  19.         if (num < 0 || min > max){//如果数组大小不满足或者小的数反而大于大的数,则返回false不做任何操作     
  20.             return false ;     
  21.         }else {     
  22.             for (int i = 0; i < num; i++){     
  23.                 //关键代码:生成随机数     
  24.                 int rand = (int) (min + random.nextInt(max-min));     
  25.                 tempArray[i] = rand;     
  26.             }     
  27.             return true ;  
  28.         }  
  29.   
  30.     }  
  31.   
  32.     public static int[] sort(int a[]){     //插入排序实现代码  
  33.    
  34.         int len = a.length;//获得数组长度     
  35.         int key;     
  36.         int i = 0;     
  37.   
  38.         for (int j = 1 ; j < len ; j++){     
  39.             key = a[j] ;     
  40.             i = j - 1 ;  
  41.             while (i > -1 && a[i] > key){     
  42.                 a[i+1] = a[i] ;  
  43.                 i = i - 1 ;  
  44.             }  
  45.             a[i+1] = key ;  
  46.         }  
  47.   
  48.         return a;   
  49.     }  
  50.   
  51.     public static int binarySearch (int []a , int key , int[] n){//二分查找实现代码  
  52.         int left = 0 ;    //左区间的边界  
  53.         int right = a.length - 1 ;   //右区间的边界  
  54.         while (left <= right){  
  55.              int middle = (left+right) / 2 ;  
  56.              if (key == a[middle]){  
  57.                        n[0]++ ;  
  58.                   return middle ;  
  59.              }  
  60.              if (key > a[middle]){  
  61.                   left = middle + 1 ;  
  62.              }else {  
  63.                          
  64.                   right = middle -1 ;  
  65.              }  
  66.                  n[0]++ ;  
  67.                    
  68.         }  
  69.         return -1 ;  
  70.     }  
  71.   
  72.     public static void print (int[] a){     
  73.   
  74.         int len = a.length;    //得到数组长度    
  75.    
  76.         for (int i = 0; i < len; i++){     
  77.             System.out.print(a[i] + "、");//打印数组元素     
  78.             if ((i+1)%20 == 0 && i != 0){//每20个数换行一次     
  79.                 System.out.print("/n");     
  80.             }     
  81.         }     
  82.   
  83.     }  
  84.   
  85.     public static void main (String[] args) throws Exception{  
  86.   
  87.               if (args.length != 3){  
  88.                     System.out.println ("尊敬的用户,输入的格式应为 java sort_algorithm.BinarySearch 参数一(num) 参数二(max) 参数三(min)/n");  
  89.                        return ;  
  90.               }  
  91.   
  92.               int num = Integer.parseInt (args[0]);  //生成的随机数的个数num  
  93.               int max = Integer.parseInt (args[1]);  //上界为max  
  94.               int min = Integer.parseInt (args[2]);  //下界为min  
  95.               int[] tempArray = new int[num]; //动态生成数组  
  96.               int key;     //你所要查找的数字  
  97.               n[0] = 0 ;  
  98.               int temp;  
  99.   
  100.               System.out.println ("随机数个数为:" + num);  
  101.               System.out.println ("上界为:" + max);  
  102.               System.out.println ("下界为:" + min);  
  103.             
  104.            if (generateRand (tempArray, num, max, min)){  
  105.                tempArray = sort (tempArray);  
  106.                print (tempArray);  
  107.                BufferedReader reader = new BufferedReader(new InputStreamReader (System.in));  
  108.                System.out.print ("/n请输入需要在" + num + "个随机数中查找的数字key:  ");  
  109.                String str = reader.readLine ();  
  110.                key = Integer.parseInt (str);  
  111.                if ((temp = binarySearch (tempArray , key , n)) == -1){  
  112.                     System.out.println ("找不到key(" + key + ")一共查找了" + n[0] + "次");  
  113.                }else {  
  114.                     System.out.println ("找到key(" + key + "),为第" + (temp+1) + "个数,一共查找了" + n[0] + "次");  
  115.                }  
  116.            }else {  
  117.                 System.out.println ("num < 0 或者 min > max 啦!");  
  118.             }  
  119.   
  120.     }  
  121. }  

 递归算兔子数目

Code:
  1. /* 
  2. *   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 
  3. *   小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    
  4. *   1.程序分析:   兔子的规律为数列1,1,2,3,5,8,13,21....    
  5. * 
  6. */  
  7.   
  8. package sort_algorithm ;  
  9.   
  10. import java.util.* ;  
  11.   
  12. public class Fibonacci {  
  13.   
  14.      public static int fibonacci (int n){  
  15.           if (n <= 1){  
  16.                 return 1 ;  
  17.           }else {  
  18.                 return fibonacci (n-1) + fibonacci (n-2);  
  19.           }  
  20.      }  
  21.   
  22.      public static void main (String[] args){  
  23.   
  24.           Scanner scan = new Scanner (System.in);  
  25.           //scan.useDelimiter ("/n");  
  26.           int n ; //保存月份  
  27.           int number ; //保存兔子数目  
  28.           System.out.print ("输入第几个月:");  
  29.           String month = scan.next ();  
  30.           n = Integer.parseInt (month);  
  31.           number = fibonacci (n);   //调用递归函数  
  32.           System.out.println ("第" + n + "个月,兔子的数目为 " + number);  
  33.      }  
  34. }  

 打印菱形

Code:
  1. /* 
  2.        打印出如下图案(菱形)    
  3.         *    
  4.         ***    
  5.         *****    
  6.         *******    
  7.         *****    
  8.         ***    
  9.         * 
  10. */  
  11.   
  12. package sort_algorithm ;  
  13.   
  14. public class Diamond {  
  15.   
  16.      public static void main (String[] args){  
  17.   
  18.             for (int i = 1 ; i <= 4 ; i++){  
  19.                  for (int j = 0 ; j < 2*i-1; j++){  
  20.                       System.out.print ("*");  
  21.                  }  
  22.                  System.out.print ("/n");  
  23.             }  
  24.   
  25.             for (int i = 3 ; i >0 ; i--){  
  26.                  for (int j = 0 ; j < 2*i-1 ; j++){  
  27.                       System.out.print ("*");  
  28.                  }  
  29.                  System.out.print ("/n");  
  30.             }  
  31.      }  
  32.   
  33. }