zoukankan      html  css  js  c++  java
  • 一道面试题:按照其描述要求用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,感觉那样处理递归的结束比较好!

  • 相关阅读:
    工厂设计模式
    Java 注解 (Annotation)你可以这样学
    java的多线程和并发库
    NIO高并发基础
    Java编写画图板程序细节-保存已画图形
    程序员必须知道的知识
    慢慢读懂经济【持续更新】-经济浅谈
    Spring IOC与AOP的简单实现
    Python网络爬虫【持续更新】-BeautifulSoup库的使用
    Python网络爬虫【持续更新】-requests库的使用
  • 原文地址:https://www.cnblogs.com/wenwujuncheng/p/3599148.html
Copyright © 2011-2022 走看看