这是我的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];
}
答案 0 :(得分:2)
假设:
结束是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中)使分区代码工作,并且您可能考虑在一次分区传递后打印数据结果,以表明自己的工作原理。你将以这种方式开发测试技能。无论如何,一旦你有一个工作快速排序,那么你可以做一些事情,比如将单独的枢轴选择分成一个函数,并与实现一起玩。
祝你好运,享受你的项目。不过不要忘记:我们想要时间,特别是时间与标准库中的排序例程进行比较!