zoukankan      html  css  js  c++  java
  • 排序系列 之 快速排序算法 —— Java实现

     基本思想:

      通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

      1.设置 low=0, high=N-1。

      2.选择一个基准元素赋值给temp,即temp=a[low]。

      3.从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于temp的值,将a[high]和a[low]交换。

      4.从low开始向前后搜索,即由前开始向后搜索(low++),找到第一个大于temp的值,将a[high]和a[low]交换。

      5.重复第3步和第4步,直到 low==high ,3,4步中,若没找到符合条件的值,执行 high-- 或 low++ ,直到找到为止。进行交换时 low和high的位置不变。当low==high时循环结束。

      基准点的选取:固定切分、随机切分、三取样切分。

      快速排序是不稳定的

      快速排序在序列元素很少时,效率比较低。因此,元素较少时,可选择使用插入排序。

     Java实现:

    package sort;
    /**
     * 快速排序的实现
     * @author 那一季的银杏叶
     * 
     */
    public class QuickSort {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new QuickSort().run();
        }
        public void run(){
            
            int a[] = {3,1,5,7,2,4,9,6};
            int n = a.length;
            System.out.println("———————————————————快速排序算法—————————————————————");
            if(n>0){
                 quickSort(a, 0, n - 1);  
            }
            for(int i=0;i<a.length;i++){  
                System.out.print(a[i]+" ");  
            }  
            System.out.println();
        }
        /**
         * 快速排序
         * 快速排序    时间复杂度为O(NlogN).
         */
        private void quickSort(int[] a,int low,int high){
            if (low < high) {  
                /**
                 * 将数组a一分为二
                 */
                int middle = getMiddle(a, low, high);
                /**
                 * 将小于基准元素的数据进行递归排序
                 */
                quickSort(a, low, middle - 1);  
                /**
                 * 将大于基准元素的数据进行递归排序
                 */
                quickSort(a, middle + 1, high);
            }  
        }
        public int getMiddle(int[] list, int low, int high) {  
            /**
             * 数组的第一个数为基准元素
             */
            int temp = list[low];     
            while (low < high) {  
                while (low < high && list[high] > temp) {  
                    high--;  
                }  
                /**
                 * 比基准小的数据移到低端
                 */
                list[low] = list[high];  
                while (low < high && list[low] < temp) {  
                    low++;  
                }  
                /**
                 * 比基准大的记录移到高端
                 */
                list[high] = list[low];
            }  
            /**
             * 此时 low == high
             */
            list[low] = temp;              
            return low;                  
        }
    }

     运行结果展示:

      (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

  • 相关阅读:
    backup1
    backup
    The operation couldn’t be completed. (LaunchServicesError error 0.)
    drawRect & layoutSubviews 调用时间
    在撤销“本地修改”之后再恢复
    APP调用系统相册,使用3DTouch重压,崩溃
    IOS_UIButton去掉系统的按下高亮置灰效果
    navigationItem的leftBarButtonItem和rightBarButtonItem隐藏
    _BSMachError: (os/kern) invalid capability (20) _BSMachError: (os/kern) invalid name (15) 问题的解决
    删除button中除label之外的View
  • 原文地址:https://www.cnblogs.com/snowcan/p/6244398.html
Copyright © 2011-2022 走看看