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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜鹏云 中级黑马   /  2012-8-7 16:13  /  2027 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

用quickSort 已经可以成功按照歌曲时间排序,请问如果遇到了时间相同的歌曲如何按照歌曲名排列呢?(如果歌曲名称还相同的话就按照演唱者排列)
这是算法部分的代码:
public static int partition(Song array[], int left, int right)
        {
              int i = left, j = right;
              Song tmp;
              int pivot = array[(left + right) / 2].time;
             
              while (i  <= j) {
                    while (array.time  < pivot)
                          i++;
                    while (array[j].time > pivot)
                          j--;
                    if (i  <= j) {
                          tmp = array;
                          array = array[j];
                          array[j] = tmp;
                          i++;
                          j--;
                    }
              };
             
              return i;
        }
          
        public static void quickSort(Song array[], int left, int right) {
              int index = partition(array, left, right);
              if (left  < index - 1)
                    quickSort(array, left, index - 1);
              if (index  < right)
                    quickSort(array, index, right);
        } 望高手提供一个能够保证运算速度的方法!感激不尽!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
不太明白哥们的意思 不过你可以试试java提供的  Arrays.sort(arr);
回复 使用道具 举报
目测你那个Song要实现comparable接口,晚点试试
回复 使用道具 举报
你的问题问的太笼统了,而且代码中没有一个字的注释,实在让人很为难啊。
给你说下思路吧。
按你描述的意思,这个程序,必须要有3个单独封装的方法 1.按时间排序 2.按歌曲名排序 3按歌手排序
想要达到你要的效果只需要一个多重判断就可以,
int  按时间排序()
{
        if(时间相同)
        {
                     if (歌曲名不同)
                     调用按歌曲名排序的方法;
           else
            调用按歌手排序的方法;       
           }
         按时间排序;

       
回复 使用道具 举报
如果 要运行速度快、、我建议你 用快速排序 、嘎嘎  一下就是几十个Y
  1. public class QuickSort {
  2. /**主方法*/
  3. public static void main(String[] args) {
  4. //声明数组
  5. int[] nums = {27, 8, 57, 9, 23, 41, 65, 19, 0, 1, 2, 4, 5};
  6. //应用快速排序方法
  7. quickSort(nums, 0, nums.length-1);
  8. //显示排序后的数组
  9. for(int i = 0; i < nums.length; ++i) {
  10. System.out.print(nums[i] + ",");
  11. }
  12. System.out.println("");
  13. }

  14. /**快速排序方法*/
  15. public static void quickSort(int[] a, int lo0, int hi0) {
  16. int lo = lo0;
  17. int hi = hi0;

  18. if (lo >= hi)
  19. return;

  20. //确定指针方向的逻辑变量
  21. boolean transfer=true;

  22. while (lo != hi) {
  23. if (a[lo] > a[hi]) {
  24. //交换数字
  25. int temp = a[lo];
  26. a[lo] = a[hi];
  27. a[hi] = temp;
  28. //决定下标移动,还是上标移动
  29. transfer = (transfer == true) ? false : true;
  30. }

  31. //将指针向前或者向后移动
  32. if(transfer)
  33. hi--;
  34. else
  35. lo++;

  36. //显示每一次指针移动的数组数字的变化
  37. /*for(int i = 0; i < a.length; ++i) {
  38. System.out.print(a[i] + ",");
  39. }
  40. System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")");
  41. System.out.println("");*/
  42. }

  43. //将数组分开两半,确定每个数字的正确位置
  44. lo--;
  45. hi++;
  46. quickSort(a, lo0, lo);
  47. quickSort(a, hi, hi0);
  48. }
  49. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
尤洋 发表于 2012-8-7 17:00
你的问题问的太笼统了,而且代码中没有一个字的注释,实在让人很为难啊。
给你说下思路吧。
按你描述的意思 ...

多重的判断是否降低了程序执行的效率
回复 使用道具 举报
对于正常人而言不会降低效率;
因为正常人听的歌曲绝大部分都不一样,要听同一首歌曲也会选择 循环播放,所以判断其实只进行了一次就结束了。
只有少部分歌曲会进行到多重判断
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马