第三次作业

Posted Even_p

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三次作业相关的知识,希望对你有一定的参考价值。

结伴成员:

    1501020523 潘一文       1501020527王修伟   

  码云地址:https://gitee.com/Even-p/projects

学习进度表:

  代码行数(新增/积累) 博客(新增/积累) 学习时间(新增/积累) 重要成长
目标 5000 30000 400  精通java程序设计
第十一周 40/40  0/0  20/20  学习了结构化程序设计
第十二周  100/140  0/0  20/40  学习了面向对象
第十三周  200/340  500/500  20/60  学习了类的封装性,修饰词...
第十四周  500/640  500/1000  20/80  学习了数组,字符串.......

 

解题思路:

  • 从序列中挑出一个元素,作为"基准"(pivot).

  • 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。

  • 对每个分区递归地进行步骤以上两步,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。

以下是具体代码及详细注释:

 1 public class Kuaisu{
 2     
 3     static void swap(int a[], int i, int j){                //定义交换两个数的方法  swap
 4         
 5         int temp;
 6         temp = a[i];
 7         a[i] = a[j];
 8         a[j] = temp;
 9     }
10     
11     
12     static int huaFen(int a[], int left, int right){        //定义分区方法,参数列表是数组a,整型left表示数组的上限,整型right表示数组的下限    
13         
14         int pivot = a[right];//声明分区基准pivot 
15         int tail = left - 1;//声明tail为小于基准的子数组最后一个元素的索引
16         
17         for (int i=left; i<right; i++){    //遍历除基准以外的所有元素
18             
19             if (a[i] <= pivot){                                
20                 
21                 swap(a, ++tail, i);//把小于等于基准的元素放到前一个子数组末尾
22             }
23         }
24         swap(a, tail+1, right);    //最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组
25         return tail + 1;//返回基准值
26         
27     }
28     
29     
30     /***此方法用来多次递归调用本身,对每一次大于或小于基准的分区,进行再分区,直至最后一个数,排序结束**/
31     static void quickSort(int a[], int left, int right){//定义递归方法
32         
33         if (left >= right)
34             return;//递归结束条件
35         int pivotIndex = huaFen(a, left, right);//此处为每次分区基准的索引
36         quickSort(a, left, pivotIndex - 1);//递归调用自己,实参为数组,数组下限,基准索引值减一
37         quickSort(a, pivotIndex+1, right);//递归调用,实参为索引,基准索引值加一,数组上限
38     }
39     
40     
41     public static void main (String args[]){
42         
43         int a[] = {15,1,2,5,23,15,1,2,5,27};//声明数组
44         int length = a.length-1;//将数组最大的索引赋值给length,作为数组基准
45         quickSort(a, 0, length);
46         
47         for (int i=0; i<a.length; i++){//遍历输出数组
48             System.out.print("  " + a[i]);                
49         }
50     }
51         
52         
53     

运行结果:

 

小结感受:

  对于接触java时间不长我来说,结对编程绝对是比较新鲜的编程方式,最开始心里是比较抵触的,因为每个人的想法他都不会是完全相同的,再编程过程中多多少少都会出现意见分歧,如果处理不好这个分歧,效率和正确率都会受到影响,这也正是我考核之前所担心的。

  但是直到考核结束,我发现意见分歧确实会有,如何处理这个分歧很重要,两个人应该都认真倾听并理解,对方的想法,并比较出与自己的想法的不同,找出两个人的优点及缺点,最后决定出来最佳方案。但我认为相对于意见分歧,选对搭档才是相对来说重要的,因为我性格是比较着急的,而且是比较粗心的,而我搭档在这方面比我强的多,在很多次我出现一些低级失误时,他都能帮我及时指正,避免了程序调错的大量时间。

  个人认为结对编程这种方法绝对是,可以提高两个人的编程能力,正所谓,“当局者迷,旁观者清”,有时我们编程时一些错误,自己很难发现,这时我们的搭档很有可能找出其中的错误所在。在这点上我认为结对编程可以达到1+1>2的效果,至少对于我搭档和我来说是这样的。

评价搭档:

  搭档的优点很多,在整个程序的大框架构上,他的思路要比我清晰地多,而且他的心态比我好。出现错误,若5分钟内我没有找到解决办法,整个人会陷入一个焦躁的状态,也越来越不耐烦,而搭档会一点一点查看程序,从逻辑上及语法上检查程序。   而且他也要比我细心地多,这点真的值得我学习,可以大幅度减少程序调错的时间。

  缺点的话,他太容易钻牛角尖了,他永远要一条路走到黑,如果他最开始的思路错误的话,很难给他拽回来。(考核的时候为了说服他,费了很大劲)他有时候应该稍微变通一点,应该会对他的编程能力有帮助。

 

以上是关于第三次作业的主要内容,如果未能解决你的问题,请参考以下文章

第三次寒假作业

第三次作业

第三次作业

第三次作业

第三次作业

第三次作业