A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱神必 金牌黑马   /  2014-2-19 21:33  /  5564 人查看  /  58 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱神必 于 2014-2-22 21:59 编辑

算法大比拼:
众所周知,算法是程序的灵魂,那么到底有多少算法呢?这些算法又是咋样的呢?那么将由大家去发现:

【规则】写明是什么算法,并介绍算法,最后写一段代码来演示该算法。

【格式】递归算法的定义:
/                       递归算法是。。。。。。,这就是递归算法。
               java代码:
                             public static void main(String[]args){
                                         。。。。。。。。。
                              }



【奖励】一个算法奖励1~2技术分,如重复则不给分必须是已定义的算法,比如冒泡等,不能子虚乌有哦,亲!              (为了能让更多人参加,每人限2次)

(该活动已结束。。。。。。)

            










0026553965b00e94a97562.jpg (86.83 KB, 下载次数: 87)

0026553965b00e94a97562.jpg

评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

58 个回复

倒序浏览
加油啊。。。。。期待你来

点评

谢谢升哥  发表于 2014-2-19 21:53
回复 使用道具 举报
a*b这是乘法运算算法:
public static void main(String[] args)
{
  method(3,5);  
}
public static void method(int a,int b)
{
   System.out.println(a*b);
}

点评

我只是举个例子,你这。。。。。现学现用了啊,哈哈  发表于 2014-2-19 21:51
回复 使用道具 举报
写一个我以前自己写的一个方法我觉得写的很好。 呵呵
  1. public static int[] removeRepeat(int[] a){//封装功能:传递一个数组,则返回一个去重的新数组!
  2.                 int[] b = new int[a.length];//定义数组,长度为a.length
  3.                 int index=0;boolean flag=true;//角标和标记值的声明
  4.                 for(int i=0;i<a.length;i++){//外圈:依次取出数组a中的一个元素,参与循环比较
  5.                         for(int j=0;j<a.length;j++){//内圈:新数组的所有元素参与比较。
  6.                                 if(a[i]==b[j])//当且仅当新数组含有指定的a[i]时,令标记为false。
  7.                                         flag=false;
  8.                         }
  9.                         if(flag){//当标记为true时,表示为非重复元素,添加进新数组。否则为重复元素,不添加。
  10.                                 b[index]=a[i];
  11.                                 index++;
  12.                         }
  13.                         flag=true;//注意:一次判断结束后需要将标记复位!
  14.                 }
  15.                 int[] s=new int[index];//由于b数组的长度不是我们想要的,所以重新装进一个长度刚好合适的数组里面。
  16.                 for(int n=0;n<index;n++){
  17.                         s[n]=b[n];
  18.                 }
  19.                 return s;//返回最终数组。
  20.         }
复制代码



点评

可不直接给数组排个序先,然后从前到后遍历一次,遇到相邻且重复的就直接标记掉,最后再移动到一个小点的数组中。  发表于 2014-3-2 21:02

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1 不错

查看全部评分

回复 使用道具 举报
需要100技术分,就再来一个:
  1. public static String[] MyEquale(String[] arr){//以compare方法为基地,实现对String数组排序功能。
  2.                 for(int i=0;i<5;i++){
  3.                         for(int j=i;j<5;j++){//大圈套小圈循环比较,排号序列。这里没有考虑效率,可能会有效率低的bug。
  4.                                 if(compare(arr[i],arr[j])){
  5.                                         String a=null;
  6.                                         a=arr[i];//换位功能,字符串没有使用相与方法
  7.                                         arr[i]=arr[j];
  8.                                         arr[j]=a;
  9.                                 }else{}
  10.                         }
  11.                 }
  12.                 return arr;
  13.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
哈哈哈,我来啦!!!!!!!!!!
回复 使用道具 举报
//折半查找。{1,5,8,9,13,16,20,25}
class ArrayDemo2
{
        public static void main(String[] args)
        {
                int[] arr={1,5,8,9,13,16,20,25};
                int mid=getIndex(arr,20);
                System.out.println(mid);
               
        }
        public static int getIndex(int[] arr,int key)
        {
                int min,max,mid;
                min=0;
                max=arr.length-1;
                mid=(min+max)/2;
                while (key!=arr[mid])
                {
                        if(key>arr[mid])//要取的值大于中间值
                                min=mid+1;//所以最小值要在中间值的位置上加1
                        else if(key<arr[mid])//要取的值小于中间值
                                max=mid-1;//所以最小值要在中间值的位置上减1

                        if(min>max)//当要找的值不存在时,最小值移的位置超过了最大值的位置
                                return -1;
                        mid=(max+min)/2;
                }
                return mid;
        }
}

点评

你这个如果随意给的数需要排序一下才行  发表于 2014-2-21 17:57

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
呵呵,那就现学现卖了。学习IO时,打印指定目录下全部内容,用到递归算法
public static void print(File file){        // 递归调用
                if(file!=null){        // 判断对象是否为空
                        if(file.isDirectory()){        // 如果是目录
                                File f[] = file.listFiles() ;        // 列出全部的文件
                                if(f!=null){        // 判断此目录能否列出
                                        for(int i=0;i<f.length;i++){
                                                print(f) ;        // 因为给的路径有可能是目录,所以,继续判断
                                        }
                                }
                        }else{
                                System.out.println(file) ;        // 输出路径
                        }
                }
        }

PS:个人认为,算法最难学

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
递归算法:这是求阶乘的。
                public static void main(String[]args){                                    
                     System.out.println(recursion(5));
                 }
                public static int recursion(int args){
                    if(args>1)
                       return args*recursion(args-1);

                   return args;
       
}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2014-2-19 23:09:43
10#
支持支持
回复 使用道具 举报
  1. /*
  2. 求斐波那契数列第n项,n<30
  3. 斐波那契数列前10项为: 1,1,2,3,5,8,13,21,34,55
  4. */
  5. public class Test1 {

  6.         public static void main(String[] args) {
  7.                
  8.                 long ret = getFibonacci(29);
  9.                
  10.                 System.out.println(ret);
  11.                
  12.         }
  13.         public static long getFibonacci(int num){
  14.                
  15.                 switch (num) {
  16.                         case 0:
  17.                                 return 0;
  18.                         case 1:
  19.                                 return 1;
  20.                         default:
  21.                                 return getFibonacci(num - 1) + getFibonacci(num - 2);
  22.                 }
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销很大的算法。
比如:
  1. import javax.swing.JOptionPane;
  2.         public class Fibonacci {
  3.                 int F(int n) {
  4.                         if(n==0)
  5.                         return 1;
  6.                         else if(n==1)
  7.                         return 1;
  8.                         else if(n>1)
  9.                         return F(n-1)+F(n-2); /*递归*/
  10.                         else
  11.                         JOptionPane.showMessageDialog(null,"方程无解!");
  12.                         return 0;
  13.                 }

  14.         public static void main(String[] args)
  15.         {
  16.                 int i,n,m;
  17.                 Fibonacci f=new Fibonacci();
  18.                 String s=JOptionPane.showInputDialog(null,"please input n:\n");
  19.                 n=Integer.parseInt(s);
  20.                         for(i=0;i<=n;i++) {
  21.                                 m=f.F(i);
  22.                                 System.out.print(m+" ");
  23.                         }
  24.                 }
  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
冒泡:这是之前看毕老师视频写的
void bubble(int[] arr){
                for(int x = 0;x<arr.length-1;x++){
                        for(int y = 0;y<arr.length-1-x;y++){
                                if(arr[y] > arr[y+1]){
                                        int temp = arr[y];
                                        arr[y] = arr[y+1];
                                        arr[y+1] = temp;
                                }
                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
  1. import java.util.*;
  2. /*
  3. 数组冒泡排序(升序)
  4. */
  5. class  ArraySort{

  6.         public static void main(String[] args){
  7.                 int[] arr = new int[]{43,21,32,25,12};
  8.                 System.out.println(Arrays.toString(sort(arr)));
  9.         }

  10.         public static int[] sort(int[] a){
  11.                 for(int i=0;i<a.length-1;i++){
  12.                         for(int j=0;j<a.length-1-i;j++){
  13.                                 if(a[j]>a[j+1]){
  14.                                         int temp=a[j];
  15.                                         a[j]=a[j+1];
  16.                                         a[j+1]=temp;
  17.                                 }
  18.                         }       
  19.                 }
  20.                 return  a;
  21.         }
  22. }
复制代码
回复 使用道具 举报
public static void show_1(int[] arr)//选择排序,从0角标开始依次同每一个角标上的值进行比较,将最小值依次   进行排序
        {
                for (int x=0;x<arr.length-1 ;x++ )
                {
                        for (int y=1+x;y<arr.length ;y++ )
                        {
                                if(arr[x]>arr[y])
                                {int temp=arr[x];
                                   arr[x]=arr[y];
                                    arr[y]=temp;
                                }
                        }
                }

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
1/*
语句嵌套形式
嵌套循环

嵌套循环 的方式求九九乘法表
同时还可按需求把结果排列成三角(倒三角)矩形等形状。
*/

class ForForDemo
{
        public static void main(String[] args)
        {
                for (int x=1;x<=9 ;x++ )
                {
                        for (int y=1;y<=x ;y++ )
                        {
                                System.out.print(y+"*"+x+"="+y*x+"\t");
                        }
                System.out.println();
                }

               
        }
}
回复 使用道具 举报
/*
求一个数组最值得方法
只列出最大值得求法,同理也能求出该数组的最小值,只要变换循环内条件即可。
*/

class  ArrayTest
{
        public static void main(String[] args)
        {
                int[] arr ={5,1,6,4,2,8};//建立一个数组
               
                int max = getMax(arr);//调用函数getMax并把结果赋值给变量int max
                System.out.println("max="+max);
        }



        public static int getMax(int[] arr)//建立int数组类型函数
        {
                int max = arr[0];//建立一个变量赋值为该数组中第一个元素
                for (int x=1;x<arr.length ;x++ )
                {
                        if (arr[x]>max)
                        {
                                max = arr[x];
                        }
               
                }return max;
        }
        }

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr={11,53,28,39,12,1,44,21};
  6.                 int mid=Index(arr,44);
  7.                 System.out.println(mid);  
  8.         }
  9.         public static int Index(int[]arr,int m)
  10.         {
  11.                 int min,max,mid;
  12.                 min=0;
  13.                 max=arr.length-1;
  14.                 mid=(min+max)/2;
  15.                 while (m!=arr[mid])
  16.                 {
  17.                         if(m>arr[mid])
  18.                                 min=mid+1;
  19.                         else if(m<arr[mid])
  20.                                 max=mid-1;
  21.                         if(min>max)
  22.                                 return -1;
  23.                         mid=(max+min)/2;
  24.                 }
  25.                 return mid;
  26.         }
  27. }
复制代码
折半查找法
回复 使用道具 举报
贪心算法的定义:
贪心算法在对问题求解时,总是做出在当前看来是最好的选择。不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法的举例
有十一个快件,每个快件有送货的起始时间,要求用最少的车,运送完所有的快件。
快件1:1:00-4:00
快件2:3:00-5:00
快件3:0:00-6:00
快件4:5:00-7:00
快件5:3:00-8:00
快件6:5:00-9:00
快件7:6:00-10:00
快件8:8:00-11:00
快件9:8:00-12:00
快件10:2:00-13:00
快件11:12:00-14:00
分析:要使用最少的车运送,那么在同一辆车上的派件必须是第二个派件的开始派发时间大于第一个
派件的截至派发时间,利用贪心算法(从局部选取最优解)那么就可以解决此问题
代码
Car类
import java.util.List;
/**
* 封装的是该车可以保存的派件信息
*/
public class Car
{
        private List<Goods> goodsList;
        public List<Goods> getGoodsList()
        {
                return goodsList;
        }
        public void setGoodsList(List<Goods> goodsList)
        {
                this.goodsList = goodsList;
        }
        @Override
        public String toString()
        {
                String value="";
                for (Goods goods : goodsList)
                {
                        value+=goods.toString();
                }
                return value;
        }
}

Goods类
/**
* 封装的是派件的一些相关信息
*/
public class Goods
{
        private String name;
        private int startTime;
        private int endTime;
        public int getStartTime()
        {
                return startTime;
        }
        public void setStartTime(int startTime)
        {
                this.startTime = startTime;
        }
        public int getEndTime()
        {
                return endTime;
        }
        public void setEndTime(int endTime)
        {
                this.endTime = endTime;
        }
        public String getName()
        {
                return name;
        }
        public Goods(String name, int startTime, int endTime)
        {
                this.name = name;
                this.startTime = startTime;
                this.endTime = endTime;
        }
        @Override
        public String toString()
        {
                return name+" ";
        }
       
}
GoodsSort类
import java.util.Comparator;
/**
* 以派件的截至时间进行排序
*/
public class GoodsSort implements Comparator<Goods>
{
        @Override
        public int compare(Goods g0, Goods g1)
        {
                return g0.getEndTime()-g1.getEndTime();
        }
}

ArrangeCar类用于安排车辆
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class ArrangeCar
{
        private static List<Car> cars=new ArrayList<>();
        public static void main(String[] args)
        {
                List<Goods> goodsList = addGoods();
                System.out.println("排序前");
                printGoods(goodsList);
                //对派件进行排序以派件的endTime进行排序
                Collections.sort(goodsList, new GoodsSort());
                System.out.println('\n'+"排序后");
                printGoods(goodsList);
                System.out.println();
               
                greedySelect(goodsList);
                System.out.println("共有"+cars.size()+"种派件方案");
                for (Car car : cars)
                {
                        System.out.println(car);
                }
        }
        /**
         * 贪心算法的运用
         * @param goodsList
         */
        public static void greedySelect(List<Goods> goodsList)
        {
                Goods goods=goodsList.remove(0);//获取排好序之后的第一个派件
                int firstEndTime=goods.getEndTime();//得到派件的endTime
                Car car=new Car();//新建立一个Car对象用于装载派件对象
                List<Goods> gList=new ArrayList<>();
                gList.add(goods);
                car.setGoodsList(gList);
                cars.add(car);//cars用于记录用了多少辆车
                for(Iterator<Goods> iterator=goodsList.iterator();iterator.hasNext();)
                {
                        Goods otherGoods=iterator.next();
                        //循环取出派件队列里面的派件,获得其开始派发时间同第一个派件的截至派发时间进行比较
                        //如果后面派件的开始派发时间大于第一个的派发时间那么可以用这两个派件装在一辆车上面
                        if(firstEndTime<=otherGoods.getStartTime())
                        {
                                gList.add(otherGoods);//装在同一辆车上面
                                firstEndTime=otherGoods.getEndTime();//改变截至派发时间值
                                iterator.remove();//移除该派件
                        }
                }
                //当循环完之后还有派件那么就进行递归再次装载车辆
                if(goodsList.size()!=0)
                {
                        greedySelect(goodsList);
                }
        }
        /**
         * 添加派件
         * @return
         */
        public static List<Goods> addGoods()
        {
                List<Goods> goodsList=new ArrayList<>();
                Goods thing8 = new Goods("派件8", 8, 11);
                goodsList.add(thing8);
                Goods thing9 = new Goods("派件9", 8, 12);
                goodsList.add(thing9);
                Goods thing10 = new Goods("派件10", 2, 13);
                goodsList.add(thing10);
                Goods thing11 = new Goods("派件11", 12, 14);
                goodsList.add(thing11);
                Goods thing1 = new Goods("派件1", 1, 4);
                goodsList.add(thing1);
                Goods thing2 = new Goods("派件2", 3, 5);
                goodsList.add(thing2);
                Goods thing3 = new Goods("派件3", 0, 6);
                goodsList.add(thing3);
                Goods thing4 = new Goods("派件4", 5, 7);
                goodsList.add(thing4);
                Goods thing5 = new Goods("派件5", 3, 8);
                goodsList.add(thing5);
                Goods thing6 = new Goods("派件6", 5, 9);
                goodsList.add(thing6);
                Goods thing7 = new Goods("派件7", 6, 10);
                goodsList.add(thing7);
                return goodsList;
        }
        /**
         * 打印货物
         * @param goodsList
         */
        public static void printGoods(List<Goods> goodsList)
        {
                for (Goods goods : goodsList)
                {
                        System.out.print(goods.getName() + ":" + goods.getStartTime()
                                        + "-" + goods.getEndTime()+" ");
                }
        }
}


评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2 赞一个!

查看全部评分

回复 使用道具 举报
  1. package array;

  2. import java.util.*;
  3. /*
  4. * 冒泡排序:相邻两个元素进行比较,满足条件换位。
  5. * 选择排序:选择一元素,不停的与其他元素比较,满足条件换位。
  6. */
  7. public class Test4 {
  8.         public static void main(String args[]){
  9.                 int[] arr1={1,3,5,6,2,4};
  10.                 int[] arr2={3,1,5,6,2,4};
  11.                 int[] arr3={3,1,5,6,2,4};
  12.                
  13.                 rankArray1(arr1);
  14.                
  15.                 rankAaary2(arr2);
  16.                
  17.                 Arrays.sort(arr3);   //指定一数组排序
  18.                
  19.                 for(int i=0;i<arr3.length;i++){
  20.                         System.out.print(arr3[i]+" ");
  21.                        
  22.                 }
  23.         }

  24.        
  25. //        冒泡排序
  26.         public static void rankArray1(int[] arr){
  27.                 int temp;
  28.                 for(int i=0;i<arr.length-1;i++){      
  29.                         for(int j=0;j<arr.length-1-i;j++){   
  30.                                 if(arr[j]>arr[j+1]){    //总是比较相邻元素大小,并把每次比较的最大值放在比较的元素的最末尾
  31.                         /*                temp=arr[j];
  32.                                         arr[j]=arr[j+1];
  33.                                         arr[j+1]=temp;     */
  34.                                         swap(arr,j,j+1);
  35.                                 }
  36.                         }
  37.                 }
  38.                 for(int i=0;i<arr.length;i++){
  39.                         System.out.print(arr[i]+" ");
  40.                 }
  41.                 System.out.println();
  42.                        
  43.         }
  44.        
  45. //        选择排序
  46.         public static void rankAaary2(int[] arr){
  47.                 int temp;
  48.                 for(int i=0;i<arr.length-1;i++){   
  49.                         for(int j=1+i;j<arr.length;j++){
  50.                                 if(arr[i]>arr[j])  //总是拿一指定角标元素和其后元素比较
  51.                                 {
  52.                         /*                temp=arr[j];
  53.                                         arr[j]=arr[i];
  54.                                         arr[i]=temp;     */
  55.                                         swap(arr,i,j);
  56.                                 }
  57.                         }
  58.                 }
  59.                 for(int i=0;i<arr.length;i++)
  60.                         System.out.print(arr[i]+" ");
  61.                 System.out.println();
  62.         }
  63.        
  64. //        位置置换(形参:指定数组,指定换位的两个下标)
  65.         public static void swap(int[] array,int a,int b){
  66.                 int temp;
  67.                 temp=array[a];
  68.                 array[a]=array[b];
  69.                 array[b]=temp;       
  70.         }
  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马