Java 快速排序大向量的方法
我有一个非常大的向量,它存储100000个不同的值,范围从0到50000。 它们代表硬盘上的柱面,我想根据磁盘调度中使用的三种不同算法对这个向量进行排序。 到目前为止,我从一个文件中读取这100000个值,将它们存储到一个向量中,然后根据所需的算法(FCFS、SCAN、SSTF)对它们进行排序。问题是,这需要太长时间,因为我是以最不具创造性的方式进行的:Java 快速排序大向量的方法,java,sorting,vector,Java,Sorting,Vector,我有一个非常大的向量,它存储100000个不同的值,范围从0到50000。 它们代表硬盘上的柱面,我想根据磁盘调度中使用的三种不同算法对这个向量进行排序。 到目前为止,我从一个文件中读取这100000个值,将它们存储到一个向量中,然后根据所需的算法(FCFS、SCAN、SSTF)对它们进行排序。问题是,这需要太长时间,因为我是以最不具创造性的方式进行的: public static Vector<Integer> sortSSTF(Vector<Integer> arra
public static Vector<Integer> sortSSTF(Vector<Integer> array){
Vector<Integer> positions = new Vector<Integer>(array);
Vector<Integer> return_array = new Vector<Integer>();
int current_pos = 0,minimum,final_pos;
while(positions.size() > 0){
minimum = 999999;
final_pos = current_pos;
for(int i=0 ; i < positions.size() ; i++){
//do some math
}
}
return_array.add(final_pos);
current_pos = final_pos;
positions.removeElement(final_pos);
}
return return_array;
}
公共静态向量sortstf(向量数组){
矢量位置=新矢量(阵列);
向量返回_数组=新向量();
int当前位置=0,最小值,最终位置;
while(positions.size()>0){
最小值=999999;
最终位置=当前位置;
对于(int i=0;i
我的函数取一个向量作为参数,复制它,做一些数学运算,从复制的数组中找到所需的元素,并将其存储在另一个数组中,该数组应根据所选的算法排序。但在一个包含N个元素的数组中,它取N!迭代要完成,这太多了,因为代码应该至少完成10次
我的问题是,我如何使这种排序更有效 Java已经有了内置的方法来快速排序
列表
;请参见集合。排序
Vector
很旧,并且由于其同步开销而导致性能损失。使用列表
实现(例如,ArrayList
)
也就是说,根据问题的内容,您似乎很难实现最短搜索时间优先算法
见相关问题
我认为,如果不将头部的当前位置作为排序方法的参数,就无法实现or算法。假设current_position的初始值始终为0,则只会给您一个按升序排序的列表,在这种情况下,您的方法如下所示:
public static List<Integer> sortSSTF(List<Integer> cylinders) {
List<Integer> result = new ArrayList<Integer>(cylinders);
Collections.sort(result);
return result;
}
公共静态列表sortSSTF(列表圆柱体){
列表结果=新的ArrayList(圆柱体);
集合。排序(结果);
返回结果;
}
但是,如果在您第一次输入该方法时,current\u pos>0
有可能,那么这不一定是正确的最短寻道时间优先顺序。然后,您的算法可能会如下所示:
public static List<Integer> sortSSTF(List<Integer> cylinders) {
List<Integer> result = new ArrayList<Integer>(cylinders);
Collections.sort(result);
return result;
}
Collections.sort(位置)代码>
当前位置的nextlowst
和nextHighest
位置的位置中查找索引(或currentPos
,如果遵循Java命名约定)
位置中删除该位置,并将其添加到返回数组中(如果它是下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个下一个
)
返回数组
nextLowestinex<0
和nextThighestIndex>=positions.size()
请注意,在while循环中不需要for循环,但在进入while循环之前,可以在步骤2中使用该循环。1。为什么要使用
Vector
而不是ArrayList
?2.你听说过集合.sort()吗代码>?“100000个不同的值,范围从0到50000”:如果您有100K个项目,并且只有50K个不同的值,那么至少会重复一个值。//做一些数学
部分可能很关键:嵌套循环将您的算法固定在O(N^2)
,因此除非“some math”优化为,比如说,O(LogN)
,您不会看到任何改进。@naitoon我可能遗漏了一些东西,但我认为使用PriorityQueue存在一个潜在问题。它假设一个稳定的排序,就好像当前的位置永远不会改变一样。但每次你移除下一个项目并寻找到那个位置时,它都会发生变化。由于每次头部移动时,最短搜索(即最接近当前位置的圆柱体)都会发生变化,因此每次从队列中删除下一个项目时,您都必须使用新的(或修改过的)比较器重建PriorityQueue。感谢您花时间帮助我。我不知道Collections.sort()
,这真的对性能有很大帮助。我使用向量,因为我最初在C++中编写了代码,所以它看起来是正确的。使用<代码> ListalLe< /Co>和SoTo()方法,代码在几分钟内运行,而不是几小时!