他的代码注释为
/**
   Sorts the quotes. Uses shellSort time complexity of n^(6/5))
   */
不懂!

解决方案 »

  1.   

    从这个程序代码的它的成员函数的名字来看,这个排序是对于书籍的排序,同时是对书籍按照不同书籍的总共书的页数来进行排序,而它给出的排序方法是将书籍按照书籍的页数从小到大进行排序,那么清楚了这些之后我们再来进一步分析它的排序方法
    在代码开头,它定义了一个books集合和一个list集合,看完下面的代码我们就知道list集合才是用来排序时候用到的,至于books集合在排序方法中没有用到,所以我们展示不要考虑它,
    public void addBook(Book book) {
        books.add(book);
        list.add(book);
      } 
    这个函数很明显是用来向集合中追加书籍的,那么我们也不过多的解释sortByPages()才是排序的核心,其实如果简单的说它的这个排序的方法很类似于我们在网络里面所说到的滑动窗口的概念,它里面的7,3,1其实就是用来控制这个的
      

  2.   

    This is the shell sort algorithm.
      

  3.   

    int[] schrittweiten = {7, 3, 1};
     is stepsShell sort:
    Shell原著的排序是把間隔為n/(2^i)先排序好, 也就是先把間隔為
    n/2的資料排序好, 再將間隔為n/4的資料排序好, ..., 最後排間隔為
    4, 2, 1的資料; 但這樣的方式會有比較多次的比較; 於是Sedgewick
    建議以間隔為4^(j+1) + 3 * 2^j + 1,
      

  4.   

    楼主,我将你的排序的核心代码重新组织了一下,觉得这是个典型的shell排序:public void sortByPages() {
        int[] schrittweiten = {7, 3, 1};
        for (int i = 0; i < 3; i++) {
          int schrittweite = schrittweiten[i];
          for (int z = 0; z < list.size(); z++)
           {
            Book temp = (Book) list.get(z);//z标识book的一个实例在list中的位置即第几本书
            int stelle = z;//stelle标识book的一个实例在list中的位置
            int weizhi=stelle - schrittweite;;//weizhi标识待排序book的实例在list中的位置
            
            while ( (weizhi >= 0)//判断book的一个实例在list中的位置是否下溢
                   &&
                   (temp.getPages() < ( (Book) list.get(weizhi)).getPages()))     
    //比较2个book的实力的大小,符合条件就继续交换    
        {    //交换过程;
              list.set(stelle, list.get(位置));
              stelle -= schrittweite;
              weizhi=stelle - schrittweite;
              
              }
            list.set(stelle, temp);
          }
        }
      

  5.   

    如果这个看起来还是费劲
    我把它简化成以下代码:
    public void sortByPages() {
        int[] schrittweiten = {7, 3, 1};//shell排序中的自增量
        for (int i = 0; i < 3; i++) {
          int schrittweite = schrittweiten[i];
          for (int z = 0; z < list.size(); z++)
           {
              temp=a[z];
           // Book temp = (Book) list.get(z);//z标识book的一个实例在list中的位置即第几本书
            int stelle = z;//stelle标识book的一个实例在list中的位置
            int weizhi=stelle - schrittweite;;//weizhi标识待排序book的实例在list中的位置
            
    //        while ( (weizhi >= 0)//判断book的一个实例在list中的位置是否下溢
      //             &&
      //             (temp.getPages() < ( (Book) list.get(weizhi)).getPages()))     
    //比较2个book的实力的大小,符合条件就继续交换    
         while ((weizhi>=0)&&(temp<a[weizhi]))
    {    //交换过程;
              a[z]=a[weizhi];        
             //  list.set(stelle, list.get(位置));
              stelle -= schrittweite;
              weizhi=stelle - schrittweite;
              
              }
           a[stelle]=temp;       
          // list.set(stelle, temp);
          }
        }这里我用数组a来代替list,功能上完全一样。
    再看看shell的资料,你就会发现这个函数实现的就是shell排序
      

  6.   

    谢谢了,seven1996(小七)!
    结帖!
      

  7.   

    谢谢了,seven1996(小七)!
    结帖!