第三次作业
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分钟内我没有找到解决办法,整个人会陷入一个焦躁的状态,也越来越不耐烦,而搭档会一点一点查看程序,从逻辑上及语法上检查程序。 而且他也要比我细心地多,这点真的值得我学习,可以大幅度减少程序调错的时间。
缺点的话,他太容易钻牛角尖了,他永远要一条路走到黑,如果他最开始的思路错误的话,很难给他拽回来。(考核的时候为了说服他,费了很大劲)他有时候应该稍微变通一点,应该会对他的编程能力有帮助。
以上是关于第三次作业的主要内容,如果未能解决你的问题,请参考以下文章