在JAVA中优化Quicksort(如果排序则更早检查)

时间:2013-11-03 17:46:22

标签: java arrays sorting quicksort

在使用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;
    }
}

1 个答案:

答案 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。

read more here