这是我的程序在快速排序算法中排序列表或数组在数组中间的枢轴如何随机选择轴?我可以用什么算法通过快速排序(随机)对数组进行排序。
public static int a[] = {1, 3, 5, 4, 6, 2, 7};
public static void main(String[] args) {
qs(a, 0, 6);
for(int p=0;p<a.length;p++)
System.out.println("after sort" + a[p]);
}
public static void qs(int a[], int f, int l) {
int i = f;
int j = l;
int x = (l + f )/ 2;
while (i < j) {
while (a[i] < a[x])
i = i + 1;
while (a[j] > a[x])
j = j - 1;
if (i < j) {
int s = a[i];
a[i] = a[j];
a[j] = s;
i = i + 1;
j = j - 1;
}
}
if (f < j)
qs(a, f, j);
if (i < l)
qs(a, i, l);
}
public void disply(int a[])
{
for(int p=0;p<a.length;p++)
System.out.println("after sort" + a[p]);
}
答案 0 :(得分:3)
int x = (int)(Math.random()*(f-l-1)) + l;
Math.random
给出从0.0到1.0的随机双精度。将其乘以间隔的长度,然后添加间隔的开始,在间隔中给出一个随机数。
答案 1 :(得分:1)
我能观察到的第一件事是你的算法并不总是正确的,请检查这个测试用例:
{ 2, 3, 5, 3, 5, 1, 7 }
您的输出是:
after sort1
after sort2
after sort3
after sort5
after sort3
after sort5
after sort7
我认为您应该更新i
和j
即使它们相等,因为您不希望分区重叠,然后您可以将第二次递归调用更改为更符合逻辑的内容:
if (i < l)
qs(a, i, l);
对于随机你可以使用@ jeremy-bentham提出的解决方案,你也可以检查java.util.Random类。