• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

随心心

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

第三次作业

1.第三次作业:

学号:1501020517李昊--1501020533王鑫洋

2.个人学习进度条:

    

代码行数(新增/累积)

博客字数(新增/累积)

学习时间(新增/累积)

重要成长

第十三周

156/300

700/1000

15/20

了解面向对象程序设计

第十四周

400/500

1500/2000

35/40

学习了数组

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.解题思路:

  题目要求:

    给定一组数列,使用快速排序的方法将数列按照由小到大的顺序对数组进行排序。数列为两名同学的学号相联,两个数为一组,如果遇到以0开头,则省略不写。

如1501020551李四-1501020550张三,则序数列为{15,1,2,5,51,15,1,2,5,50}。

    输出格式:

    输出排序后的数列,以空格分隔。

    输出样例:

    1 1 2 2 5 5 15 15 50 51

快速排序思想:

  快速排序算法介绍 快速排序和归并排序都使用分治法来设计算法,区别在于归并排序把数组分为两个基本等长的子数组,分别排好序之后还要进行归并(Merge)操作,而快速排序拆分子数组的时候显得更有艺术,取一个基准元素,拆分之后基准元素左边的元素都比基准元素小,右边的元素都不小于基准元素,这样只需要分别对两个子数组排序即可,不再像归并排序一样需要归并操作。基准元素的选取对算法的效率影响很大,最好的情况是两个子数组大小基本相当。为简单起见,我们选择最后一个元素,更高级的做法可以先找一个中位数并把中位数与最后一个元素交换,之后再进行相同的操作步骤。

快速排序实现:

  把数组拆分为两个子数组加上一个基准元素: 选取最后一个元素作为基准元素,index变量记录最近一个小于基准元素的元素所在的位置,进入循环体进行循环比较

代码部分:

以下是代码部分:public class ee{

    public static void main(String []args)
    {
       int[] a = {15,1,2,5,17,15,1,2,5,33};
       int start = 0;
       int end = a.length-1;
       sort(a,start,end);
       for(int i = 0; i<a.length; i++)
       {
            System.out.print (a[i]+" ");
       }
       
    }
    
    public static void sort(int[] a,int low,int high)
    {
        int start = low;
        int end = high;
        int key = a[low];
        while(end>start)
        {
            while(end>start&&a[end]>=key) 
                end--;
            if(a[end]<=key)
            {
                int temp = a[end];
                a[end] = a[start];
                a[start] = temp;
            }
            while(end>start&&a[start]<=key)                 //从后往前进行比较,如果没有比基准值小的,就继续向后比较。                                   
               start++;
            if(a[start]>=key)
            {
                int temp = a[start];
                a[start] = a[end];
                a[end] = temp;
            }
        }

  
//此时第一次循环比较结束,关键值的位置已经确定了。
//左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
if(start>low) sort(a,low,start-1);                 //左边排序第一个索引位置到基准值索引-1
if(end<high) sort(a,end+1,high);                 //右边排序右边关键值+1到最后一个
}
}

  运行结果如下图

 

 

 

 

 小结感受:结对编程真的能够带来1+1>2的效果吗?

能。遇到问题每个人的想法会不一样,有时候会进入误区,两个人会相互弥补对方的不足,起到事半功倍的效果。

 

运用“汉堡包”的方式,评价你的合作伙伴,指出优点、缺点,希望ta提高的地方

他很聪明,遇到问题也基本是他帮我改正。至于缺点,嫌弃我。希望他改正态度,不要嫌弃我。

 

posted on 2017-12-02 18:41  随心心  阅读(162)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3