我为快速排序和合并排序创建了代码,现在我试图在代码中添加比较计数和开关计数,但我不知道在哪里添加“比较”和“开关”。
我的快速排序代码
public void quickSort( int start, int finish )
{
comparisons = 0;
switches = 0;
int[] temp = new int[numbers.length];
int lowSpot = start;
int hiSpot = finish;
int pivot = (int)(Math.random()*(finish+1-start)) + start;
for( int i = start; i <= finish; i++ )
{
if( i != pivot )
{
if( numbers[i] <= numbers[pivot] )
{
temp[lowSpot] = numbers[i];
lowSpot++;
}
else
{
temp[hiSpot] = numbers[i];
hiSpot--;
}
}
}
temp[lowSpot] = numbers[pivot];
for( int j = start; j <= finish; j++ )
{
numbers[j] = temp[j];
}
if( start < lowSpot - 1 )
{
quickSort( start, lowSpot - 1 );
}
if( hiSpot + 1 < finish )
{
quickSort( hiSpot+1, finish );
}
}
我的合并和合并代码
public int[] merge( int[] one, int[] two )
{
comparisons = 0;
switches = 0;
one = mergeSort( one );
two = mergeSort( two );
int[] merged = new int[one.length+two.length];
int oneLoc = 0;
int twoLoc = 0;
for( int i = 0; i < merged.length; i++ )
{
if( oneLoc < one.length && twoLoc < two.length )
{
if( one[oneLoc] <= two[twoLoc] )
{
merged[i] = one[oneLoc];
oneLoc++;
}
else
{
merged[i] = two[twoLoc];
twoLoc++;
}
}
else if( oneLoc < one.length )
{
merged[i] = one[oneLoc];
oneLoc++;
}
else
{
merged[i] = two[twoLoc];
twoLoc++;
}
}
return merged;
}
public int[] mergeSort( int[] temp )
{
if( temp.length == 1 )
{
return temp;
}
else if( temp.length == 2 )
{
if( temp[0] > temp[1] )
{
int holder = temp[0];
temp[0] = temp[1];
temp[1] = holder;
}
return temp;
}
else
{
int mid = temp.length / 2;
int[] first = new int[mid];
int[] second = new int[temp.length-mid];
for( int i = 0; i < temp.length; i++ )
{
if( i < mid )
{
first[i] = temp[i];
}
else
{
second[i-mid] = temp[i];
}
}
return merge( first, second );
}
}
比较是当你......比较变量(即开始
快速排序 from typing import List def quick_sort(arr: List, left, right) -> List: """ 快速排序是对冒泡排序的改进,核心思想是找到一个中值点pivot,然后将小于等于pivot的放在pivot的左边,大于pivot的放在右边,一直递归到无法拆分pivot点。 :param arr: :re
问题内容: [http://jsperf.com/optimized-mergesort-versus- quicksort][1] 为什么这个半缓冲区合并排序的工作速度与quicksort一样快? QuickSort是: 就地虽然会占用递归(堆栈空间) 缓存友好 这一半缓冲区合并排序: 使用Buffer进行合并。 使用递归。 进行较少的比较。 我的问题是,在这种情况下,为什么半缓冲区合并排序与Q
本文向大家介绍比较排序之快速排序(实例代码),包括了比较排序之快速排序(实例代码)的使用技巧和注意事项,需要的朋友参考一下 快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在
问题:Mergesort将一个数字列表分成两半,并对这两个数字进行递归调用。相反,您能在左半部分执行quicksort,在右半部分执行mergesort吗?如果是,则通过显示每个步骤来显示它将如何对下面的数字列表进行排序。如果没有,请解释为什么不能。 Iam应该使用MergeSort对数字列表进行排序。左半部分将使用快速排序进行排序? 我想出来了。安:是的,我们可以 使用mergeSort对数组的
双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并
我已经阅读并理解了Mergesort的工作原理(作为文本),现在我正在尝试对其进行编码。我已经完成了分割数据的部分(我使用向量),直到它的每个大小都为1。现在我已经在Mergesort中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小