他的代码注释为
/**
Sorts the quotes. Uses shellSort time complexity of n^(6/5))
*/
不懂!
/**
Sorts the quotes. Uses shellSort time complexity of n^(6/5))
*/
不懂!
解决方案 »
- 一个java多线程问题,求牛人指教
- assert问题
- equals与hashCode
- 一个JAVA图像编程程序:绘制房子,请大虾给点注释,本人是初学者,谢谢!
- 怎样让服务器实现转发.
- 关于顺序查找,折半查找算法的问题!请帮忙
- 【关于resultset】我想找到resultset中的记录个数,在使用last函数的时候,总是报错:对只转发结果集的无效操作: last
- java初学者的几个问题。
- 上传一个指定的文件, 请大家近来看看。 问题能解决, 由发表的都给分!!
- 关于java迭代器的
- oracle数据库中数据导出到一个文本文件中,每一条记录的换行问题
- 加密和解密的过程是完全可逆的吗?为什么我加密后解密出现问题?
在代码开头,它定义了一个books集合和一个list集合,看完下面的代码我们就知道list集合才是用来排序时候用到的,至于books集合在排序方法中没有用到,所以我们展示不要考虑它,
public void addBook(Book book) {
books.add(book);
list.add(book);
}
这个函数很明显是用来向集合中追加书籍的,那么我们也不过多的解释sortByPages()才是排序的核心,其实如果简单的说它的这个排序的方法很类似于我们在网络里面所说到的滑动窗口的概念,它里面的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,
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);
}
}
我把它简化成以下代码:
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排序
结帖!
结帖!