Quicksort不工作

时间:2009-10-14 03:21:16

标签: java sorting quicksort

这是我的quicksort方法的所有代码,它适用于一组21个数字,但不是我的真实数据集,大约是100000.我不知道出了什么问题,我一直在摆弄两个小时,很快到期!任何帮助都会非常受欢迎

public static void hybridQuicksort( int[] a, int start, int end )
{
    final int MIN = 13;
    if ( end - start >= MIN )
    {
        int pivot = findPivot( a, start, end );
        pivot = partition ( a, start, end, pivot );
        hybridQuicksort( a, start, pivot - 1 );
        hybridQuicksort( a, pivot + 1, end);
    }
    else
    {
        insertionSort( a, start, end );
    }
}

//partitions the array based on the pivot
public static int partition( int[] a, int start, int end, int pivot )
{
    int up = start + 1;
    int down = end;

    while ( up <= down )
    {

        while ( a[up] <= pivot)
            up++;

        while ( a[down] > pivot)
            down--;

        if ( up <= down )
            swap( a, up, down );
    }

    swap( a, start, down );

    return up;
}

//finds the first, middle, middle of first and middle, middle of middle and last
//and last numbers and sets their median as the pivot
public static int findPivot( int[] a, int start, int end )
{
    //swap the 4 numbers to the start of the array, leaving the first as is
    swap( a, start + 1, end - 1 );
    swap( a, start + 2, (start + end) / 2);
    swap( a, start + 3, end / 4);
    swap( a, start + 4, (end / 2) + (end / 4) );

    //sort the 5 numbers
    insertionSort( a, 0, 5 );

    //swap the median to the front, that's the pivot
    swap( a, start, start + 2 );
    //return the pivot
    return a[start];
}

2 个答案:

答案 0 :(得分:2)

假设:

  • a持有10'000个样本,
  • start是500
  • 结束是1000

    //swap the 4 numbers to the start of the array, leaving the first as is
    swap( a, start + 1, end - 1 );
    swap( a, start + 2, end / 2);
    swap( a, start + 3, end / 4);
    swap( a, start + 4, (end / 2) + (end / 4) );
    

end / 4是250

.. 您正在从排序子集外部交换值

答案 1 :(得分:0)

这看起来不像是作业问题。如果这是一个家庭作业问题,作者会写出大约七到十行代码,并证明其有效性,然后将其转入。这家伙正试图变得花哨,并且在背后咬他。您可以通过他对插入排序的方式来判断所谓的“小”间隔。 (线索:阈值间隔大小超过测试数据大小的一半。如果要对其进行测试,请为算法提供一些空间来进行递归。)其次,他正在做一些额外的工作来寻找理想的支点。这种复杂性是有代价的。

这是工作中的业余爱好者。他需要的不仅仅是答案。他需要一种解决难题的方法。 Quicksort只是这种教育的载体。

这是我的方法。

诀窍是将Quicksort写成Quicksort,让它工作,然后担心花哨的特殊技巧。消除关于插入排序小间隔的噪音。假设任何大小为零或一的区间已经排序(这是您的基本情况),然后使用区间的左端作为枢轴(如在经典的原始Quicksort中)使分区代码工作,并且您可能考虑在一次分区传递后打印数据结果,以表明自己的工作原理。你将以这种方式开发测试技能。无论如何,一旦你有一个工作快速排序,那么你可以做一些事情,比如将单独的枢轴选择分成一个函数,并与实现一起玩。

祝你好运,享受你的项目。不过不要忘记:我们想要时间,特别是时间与标准库中的排序例程进行比较!