我见过很多快速排序算法,我想知道这两种算法之间的区别是什么,如果有更多的,也许更简单的算法。除了一个是整数,另一个是字符…
这是第一个:

public class MyQuickSort {

private int array[];
private int length;

public void sort(int[] inputArr) {

    if (inputArr == null || inputArr.length == 0) {
        return;
    }
    this.array = inputArr;
    length = inputArr.length;
    quickSort(0, length - 1);
}

private void quickSort(int lowerIndex, int higherIndex) {

    int i = lowerIndex;
    int j = higherIndex;
    // calculate pivot number, I am taking pivot as middle index number
    int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
    // Divide into two arrays
    while (i <= j) {
        /**
         * In each iteration, we will identify a number from left side which
         * is greater then the pivot value, and also we will identify a number
         * from right side which is less then the pivot value. Once the search
         * is done, then we exchange both numbers.
         */
        while (array[i] < pivot) {
            i++;
        }
        while (array[j] > pivot) {
            j--;
        }
        if (i <= j) {
            exchangeNumbers(i, j);
            //move index to next position on both sides
            i++;
            j--;
        }
    }
    // call quickSort() method recursively
    if (lowerIndex < j)
        quickSort(lowerIndex, j);
    if (i < higherIndex)
        quickSort(i, higherIndex);
}

private void exchangeNumbers(int i, int j) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

public static void main(String a[]){

    MyQuickSort sorter = new MyQuickSort();
    int[] input = {24,2,45,20,56,75,2,56,99,53,12};
    sorter.sort(input);
    for(int i:input){
        System.out.print(i);
        System.out.print(" ");
    }
  }
 }

第二个:
class Quicksort{
static void qsort(char items[]){
    qs(items, 0, items.length-1);
}

//a recursive version of Quicksort for characters
private static void qs(char items[], int left, int right){
    int i, j;
    char x, y;

    i = left; j = right;
    x = items[(left+right)/2];

    do{
        while((items[i] < x) && (i < right)) i++;
        while((x < items[j]) && (j > left)) j--;

        if(i <= j){
            y = items[i];
            items[i] = items[j];
            items[j] = y;
            i++; j--;
        }
    } while(i <= j);

    if(left < j) qs(items, left, j);
    if(i < right) qs(items, i, right);
 }
}

public class QSDemo {
public static void main(String[] args) {

    char a[] = { 'd', 'x', 'a', 'r', 'p', 'j', 'i' };
    int i;

    System.out.println("Original array: ");
    for(i = 0; i < a.length; i++)
        System.out.print(a[i]);

    System.out.println();

    //now, sort the array
    Quicksort.qsort(a);

    System.out.println("Sorted array: ");
    for(i = 0; i < a.length; i++)
        System.out.print(a[i]);

    }
}

最佳答案

快速排序的性能如何主要取决于轴的选择如果你完美地选择了它们,你就得到了o(n logn),这也是平均情况,但最坏的情况是o(n^2)。因此,对于大型阵列,具有最佳支点选择策略的实现将优于其他实现,但对于小型阵列,这可能是一个开销选择支点的好策略是什么?这取决于问题和您期望的数据。所以问这个问题类似于问哪个是“最好的”编程语言,答案是:这取决于问题。如果您正在寻找真正的通用方法,那么有一些策略可以减少糟糕的轴心点选择的可能性,但它们不能保证这一点。或者像Introsort这样的混血儿。

10-04 17:51