一道面试题:按照其描述要求用java语言实现快速排序

回来想了想,写出了如下的程序:

/**
 * 一道面试题,按照其描述要求进行快速排序(英文的,希望理解是对的。。)
 * 要求:和一般的快速排序算法不同的是,它不是依次交换pivot和左右元素节点(交换2次),而是交换pivot左边的元素和pivot右边的元素。
 * 
 * 自己笔写的程序大体上是正确的,但是递归的结束条件没有处理好(我当时写的是返回的i索引值大于0)。
 * 递归的结束条件???
 * 
 * 现在看看代码,实际运行了,感觉返回的i索引值大于0这个递归结束条件真的是不对的,因为可能一次排序后根本没有改变任何元素位置,这样i的值是不会发生改变的
 * 
 * 这里想到一个递归结束的办法是:如果对整个数组进行快速排序以及pivot左右两部分的快速排序没有交换元素,则认为数组已经有序,结束递归!!!
 * @author win7
 *
 */
public class TestQuickSort {
    static int[] a = {7,3,33,58,8,9,38,7,9};
    static boolean allSortedFlag = true;
    static int quickSort(int start, int end, int[] array) {
        int i = start;
        int j = end;
        int pivot = a[start + (end - start) / 2 ];
        System.out.println("pivot:" + pivot);
        while(i <= j){
            while(a[i] < pivot) { i++; }
            while(a[j] > pivot) { j--; }
//            printArray(a);
            if(i <= j && a[i] > a[j]) { swapvalue(a, i, j); }
//            printArray(a);
            i++;
            j--;
        } 
        printArray(a);
        System.out.println("--------------------------------------------------");
        return i;
    }

    private static void printArray(int[] a2) {
        for (int i = 0; i < a2.length; i++) {
            System.out.print(a2[i] + " ");
        }
        System.out.println();
    }
    private static void swapvalue(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
        allSortedFlag = false;
    }
    
    public static void main(String[] args) {
//        int middle = 4;
//        while(middle > 0) {
//            middle = quickSort(0, a.length - 1, a);
//            quickSort(0, middle - 1, a);
//            quickSort(middle, a.length - 1, a);
//        }
        allSortedFlag = false;
        while(!allSortedFlag) {
            allSortedFlag = true;
            int middle = quickSort(0, a.length - 1, a);
            quickSort(0, middle - 1, a);
            quickSort(middle, a.length - 1, a);
        }
    }
}

一点感觉:递归的使用的难点在于如何结束递归。上面的处理可能不太好。

参考自己另一篇的随笔(但是参考网上的代码写的),http://www.cnblogs.com/wenwujuncheng/p/3390780.html,感觉那样处理递归的结束比较好!

原文地址:https://www.cnblogs.com/wenwujuncheng/p/3599148.html