在使用quicksort对数组进行排序之前,我想检查数组是否已排序。 我总是在第77行获得stackoverflow,或者在第65行获得数组索引超出范围的错误。 我的基本想法是检查前两个数字是否排序,然后是第二个和第三个,依此类推。如果它们没有排序,那么整个while循环应该取消并使用最后一个正确的排序值作为竞争价值使用quicksort开始排序。
public class customQuickSort
{
Runtime runtime = new Runtime();
private int[] a;
private int n;
boolean isSorted = true;
int arraySortCount = 0;
int x = 0;
public customQuickSort(int[] unsorted)
{
sort(unsorted);
}
@Override
public void sort(int[] a)
{
this.a=a;
n=a.length;
runtime.start();
quicksort(0, n-1);
runtime.end(getCounter());
}
private void quicksort (int lo, int hi)
{
int i=lo, j=hi;
while(isSorted = true && arraySortCount < a.length-1)
{
if(a[arraySortCount] <= a[(arraySortCount+1)])
{
if(arraySortCount == a.length-2)
{
System.out.println("array sorted ascending");
}
}
else if(a[arraySortCount] >= a[(arraySortCount+1)])
{
if(arraySortCount == a.length-2)
{
System.out.println("array sorted descending");
}
}
else
{
isSorted = false;
x=a[c(arraySortCount)];
System.out.println("unsorted");
}
arraySortCount++;
}
if(isSorted == false)
{
while (i<=j)
{
while (a[i]<x)
{
i++;
}
while (a[j]>x)
{
j--;
}
if (i<=j)
{
exchange(i, j);
i++; j--;
}
}
if (lo<j) quicksort(lo, j);
if (i<hi) quicksort(i, hi);
}
}
private void exchange(int i, int j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
答案 0 :(得分:1)
只需使用
Arrays.sort(T[], Comparator<? super T> c)
它使用高度优化的排序算法
实施说明:此实施是稳定的,适应性的, 迭代合并,需要远远少于n lg(n)的比较 当输入数组部分排序时,同时提供 输入数组时传统mergesort的性能 随机排序。如果输入数组几乎排序,那么 实施需要大约n次比较。临时存储 要求从几乎排序的输入数组的小常量变化 对于随机排序的输入数组的n / 2个对象引用。
实施同样有利于升序和降序 在其输入数组中排序,并可以利用升序和 在同一输入数组的不同部分中降序排列。它是 非常适合合并两个或多个排序数组:简单地连接 数组并对结果数组进行排序。
该实现改编自Tim Peters的Python列表 (TimSort)。它使用了Peter McIlroy的“乐观排序”中的技术 和“信息理论复杂性”,“第四次会议论文集” 年度ACM-SIAM离散算法研讨会,第467-474页,1月 1993。