在没有递归和堆栈的情况下创建快速排序

时间:2015-05-01 13:43:25

标签: java quicksort

我有一个任务是在Java中编写快速排序(仅限posivite数字)algorythm(我不能使用任何导入但是使用Scanner)但没有递归和没有堆栈。
我有两个问题:

  1. 我使用堆栈和递归版本进行低速迭代快速排序,但我无法想象没有它的情况下如何做到这一点。 我听说过一些'到位'实施,但我真的没有 - 它是我的问题的解决方案?
    我很感激,如果有人能告诉我这样做的方法(如果可以的话,不要发布实施,我只是想知道它不会复制别人的代码)或推荐一些我能找到它的书(或者一些类似的问题) )。
  2. 通过插入一些小型数组实现排序是一个好主意吗?如果是这样,代码中N应该有多大:

    if (arraySize < N)
        insertionSort
    else 
        quickSort
    fi
    

3 个答案:

答案 0 :(得分:3)

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

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;
}

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

答案 1 :(得分:1)

Just as a reference the Java8 implementation of Arrays.sort(int[]) uses a threshold of 47, anything less than that is sorted using insertion. Their quick sort implementation is however very complex with some initial overhead, so look upon 47 as an upper limit.

答案 2 :(得分:-1)

Google&#34;非递归快速排序&#34;产生了大量答案......包括这一个:Non recursive QuickSort&#34;您的语言可能会有所不同,&#34;但基本原则不会。

我个人认为,如果您要对某些内容进行排序,您可以在所有情况下使用Quicksort。 。 。

当然,除非您可以在您喜欢的目标语言中使用sort()函数,并将其留给语言实现者选择一个聪明的算法(嗯,它可能是Quicksort ......)给你。如果您没有 来指定执行此类常规任务的算法,那么就不要这样做!&#34;不要!&#34; : - )