【发布时间】:2018-03-03 04:08:06
【问题描述】:
快速排序算法的平均时间复杂度是 O(nlogn)。这意味着它应该随着 n 值的增加而严格增加。 但是为什么在这种情况下时间是增加 - 减少 - 增加。 为什么它随着n值的增加而减小
我正在使用 java 的函数生成随机输入
解决办法是什么?
public class Qsort {
static Scanner sc = new Scanner(System.in);
public static void main(String args[]) throws IOException {
File file = new File("Qtest.txt");
PrintWriter output = new PrintWriter(file);
int n,i;
System.out.println("Enter the times of iteration");
n = sc.nextInt();
for(int j=1000;j<=n*1000;j=j+1000)
{
Random r = new Random();
int array[];
array = new int[j];
for(i=0;i<j;i++)
{
array[i] = r.nextInt(2000);
}
long startTime = System.nanoTime();
Qsort(array,0,j-1);
long endTime = System.nanoTime();
output.println(j + " " + (endTime-startTime));
System.out.println("After sorting the time elapsed is " +(endTime-startTime));
}
output.close();
}
快速排序的排序功能
public static void Qsort(int A[],int start,int end)
{
if(start>=end) return;
int p = partition(A,start,end);
Qsort(A,start,p-1);
Qsort(A,p+1,end);
}
public static int partition(int A[],int start,int end)
{
int pivot = A[end];
int p = start;
for(int i =start;i<end;i++)
{
if(A[i]<=pivot)
{
int temp = A[i];
A[i] = A[p];
A[p] = temp;
p++;
}
}
int temp = A[p];
A[p] = A[end];
A[end] = temp;
return p;
}
}
我得到的输出:
输入迭代次数 10
对于 1000 个输入:排序后经过的时间为 779133
对于 2000 个输入:排序后经过的时间是 8350639
对于 3000 个输入:排序后经过的时间为 607856
对于 4000 个输入:排序后经过的时间是 833593
对于 5000 个输入:排序后经过的时间是 1042426
对于 6000 个输入:排序后经过的时间是 1283195
对于 7000 个输入:排序后经过的时间为 1497488
对于 8000 个输入:排序后经过的时间是 1261182
对于 9000 个输入:排序后经过的时间为 1207128
对于 10000 个输入:排序后经过的时间为 1427456
【问题讨论】:
-
你能解释一下吗
-
如何在每次循环运行 j 的新值时清除缓存
-
当您使用随机值时,所用的实际时间也更加随机。您也只对每种尺寸运行一种排序。这不会给你一个可靠的结果。每个尺寸运行一百万次。
-
当我只为一个 j 值运行它时。这些是我每次得到的输出......在对5000经过的时间进行排序之后是2415390,在对10000经过的时间进行排序之后是3281184,在对15000经过的时间进行排序之后是2624570,为什么即使我运行它也会减少每次分开
-
阅读:stackoverflow.com/questions/504103/… ...以及答案链接到的各种来源。