这是我在实现快速排序算法时遇到的代码。你能在这里解释一下递归是如何工作的吗?
void quickSort(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
我读过关于快速排序算法的文章,但我不明白如何选择pivot元素。从教程中我得到了quciksort的示例代码:
public void quicksort(int[] A, int left, int right) {
int pivot = A[left + (right - left) / 2];
int i = left;
int j = right;
while (i <= j) {
while (A[i] < pivot) {
i++;
}
while (A[j] &g
我检查了K&R书中的快速排序代码,2小时后我仍然不能理解第一个交换(swap(a, left, (left+right)/2);)实现了什么。我试着删除它,但排序仍然有效。有人能解释一下吗?这是一个性能问题吗?如果是这样,为什么呢?这个动作在我看来似乎是随机的(也就是说,在一些数字组上,它将提高性能,而在一些数字上则不会)。
谢谢。
void qsort(int a[], int left, int right)
{
int i, last;
if (left >= right)
return;
swap(a, left, (left+
我正在尝试使用递归和几种辅助方法来实现quickSort。当我运行程序时,我得到一条越界消息,告诉我我已经转向数组的index -1。有没有人能提供关于修复我的quickSort方法的建议?(这就是问题所在)。我知道我的其他方法是正确的。
示例{7,6,5,4,3,2,1}
结果应该是{1,2,3,4,5,6,7}
public static <T extends Comparable<? super T>> void quickSort(T[] a) {
quickSort(a,0,a.length - 1);
}
public st
我实现了以下代码,但它似乎不适用于我的数组具有重复值的情况。
private int partition(Integer[] arr,int left, int right)
{
int i = left;
int j = right;
int pivot = arr[left];
while(true)
{
while(arr[i] <pivot) i++;
while(arr[j] > pivot) j--;
if(i < j)
{
p
我如何生成并打印快速排序的最坏情况集,考虑到中间元素?这是我的快速排序算法的实现:
void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
in
试图创建一个使用指针的快速排序算法,但没有太多的运气。我的代码可以编译,但不能工作,我对如何纠正这个问题感到困惑。任何帮助都将不胜感激。
int* partition(int* start, int* stop) {
int* pivot = stop - 1; // you can randomly pick one as the pivot
int* i = start;
int* j = stop - 1;
for (;;) {
while (i < pivot && i < stop) ++i; // skip
我需要实现一个对未排序的数组或整数进行k路合并排序的函数。
该函数接受两个参数,一个整数K,它是排序的“方式”,始终是2的幂。第二个参数是要排序的整数数组,其长度也是2的幂。
该函数返回一个包含已排序元素的数组。到目前为止,我知道如何实现常规的合并排序。我如何修改这段代码,使其实现K-way合并排序?(注意:此函数不返回已排序的数组,我也需要帮助。它也不接受K,因为它是一个常规的合并排序)
下面的代码:
public class MergeSort {
public static void main(String[] args) {
}
public static void
我很难理解何时使用:
while (left < right ) {
}
与何时使用:
while (left <= right ) {
}
此外,在设置左右边界时,有时我们使用:
left = mid
有时我们用
left = mid + 1;
类似的
right = mid; vs
right = mid - 1;
在二元搜索的知识中,我缺少什么基本的知识吗?