java - 创建没有递归和堆栈的快速排序

标签 java quicksort

我的任务是用 Java 编写快速排序(仅在正数上)算法(我不能使用任何导入,但 Scanner)但没有递归和堆栈。
我有两个问题:

  1. 我了解堆栈和递归版本的迭代快速排序,但我无法想象没有它该怎么做。 我听说过一些“就地”实现,但我不太明白 - 它能解决我的问题吗?
    如果有人能告诉我一种方法(如果可以,请不要发布实现,我只是想理解它而不是复制某人的代码)或推荐一些我能找到的书(或一些类似的问题),我将不胜感激。<
  2. 对一些小数组实现插入排序是个好主意吗?如果是这样,这段代码中的 N 应该有多大:

    if (arraySize < N)
        insertionSort
    else 
        quickSort
    fi
    

最佳答案

显然我的任务是找到唯一正数,这是我的解决方案:

public static void quickSort(final int size) {
    int l = 0;
    int r = size - 1;
    int q, i = 0;
    int tmpr = r;
    while (true) {
        i--;
        while (l < tmpr) {
            q = partition(l, tmpr);
            arr[tmpr] = -arr[tmpr];
            tmpr = q - 1;
            ++i;
        }
        if (i < 0)
            break;
        l++;
        tmpr = findNextR(l, size);
        arr[tmpr] = -arr[tmpr];
    }
}

private static int findNextR(final int l, final int size) {
    for (int i = l; i < size; ++i) {
        if (arr[i] < 0)
            return i;
    }
    return size - 1;
}

private static int partition(int l, int r) {
    long pivot = arr[(l + r) / 2];
    while (l <= r) {
        while (arr[r] > pivot)
            r--;
        while (arr[l] < pivot)
            l++;
        if (l <= r) {
            long tmp = arr[r];
            arr[r] = arr[l];
            arr[l] = tmp;
            l++;
            r--;
        }
    }
    return l;
}

我要排序的数组是我类(class)中的静态数组。 它基于查找和创建负数。 分区是通过使用数组中的中间元素创建的,但使用中位数也很好(它取决于数组)。 我希望有人会发现这很有用。

关于java - 创建没有递归和堆栈的快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987995/

相关文章:

java - 是否有必要始终在构造函数中调用它?

java - 快速排序实现程序数组越界错误且未对生成的数字进行排序

algorithm - 这个快速排序实现的错误是什么?

java - WordNet(JWI 麻省理工学院): Antonyms of a word?

java - 编写双向映射时如何绕过 "Erasure of method is the same as another method"

java - java读取文件时如何跳过从 '#'开始的行?

java - 如何获取数组的索引

java - Java 中的快速排序算法排序不正确(第一个元素作为枢轴)

java - 从三个项目的中位数中选择Pivot QuickSort(JAVA)

javascript - 在 Javascript 中实现快速排序