回来想了想,写出了如下的程序:
/** * 一道面试题,按照其描述要求进行快速排序(英文的,希望理解是对的。。) * 要求:和一般的快速排序算法不同的是,它不是依次交换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,感觉那样处理递归的结束比较好!