zoukankan      html  css  js  c++  java
  • 快速排序的一种Java实现

    快速排序是笔试和面试中很常见的一个考点。
    快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多。除此之外,快速排序是不稳定的,冒泡排序是稳定的。

    1.原理

    (1)在数据集之中,选择一个元素作为"基准"(pivot)。
    (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
    (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
    注:此处参考了阮一峰老师的文章

    2.对原理的解读

    (1)基准是可以任选的,可以从一个数组的开头选,也可以从中间选,当然也可以从最后选。总之,任意选都可以。个人认为将数组开头的元素作为基准比较容易理解。
    (2)「二分法」的思想,也就是「分而治之」。
    (3)采用递归实现。

    3.Java实现

     1 package com.primeton.sort;
     2 
     3 import java.util.Arrays;
     4 /**
     5  * 快速排序类
     6  * @author Chen
     7  *
     8  */
     9 public class QuickSort {
    10 
    11     private static int num = 0;    //比较次数,在显示方法中使用
    12     
    13     /**
    14      * 每轮排序结束后都显示一次
    15      * @param a 
    16      */
    17     public static void show(int[] a){
    18         num++;
    19         System.out.println("第"+num+"次: "+Arrays.toString(a));
    20     }
    21     
    22     /**
    23      * 重载
    24      * @param a
    25      */
    26     public static void quickSort(int[] a){
    27         quickSort(a,0,a.length-1);
    28     }
    29     
    30     /**
    31      * 快速排序
    32      * @param a
    33      * @param base        基准点
    34      * @param arrEle    数组元素
    35      */
    36     public static void quickSort(int[] a,int base,int arrEle){
    37         int i, j;  
    38         i = base;  
    39         j = arrEle;
    40         
    41         if ((a == null) || (a.length == 0)){
    42             return;  
    43         }
    44         if(base<0 || arrEle < 0 || arrEle<base){
    45             return;
    46         }
    47           
    48         while (i < j) {//查找基准点下标  
    49             while (i < j && a[i] <= a[j]){ // 以数组下标base的数据为基准,从右侧开始扫描
    50                 j--;  
    51             }
    52             if (i < j) { // 右侧扫描,找出第一个比base小的,交换位置  
    53                 int temp = a[i];  
    54                 a[i] = a[j];  
    55                 a[j] = temp;  
    56             }  
    57             while (i < j && a[i] < a[j]){  // 左侧扫描(此时a[j]中存储着base值)
    58                 i++; 
    59             }
    60             if (i < j) { // 找出第一个比base大的,交换位置  
    61                 int temp = a[i];  
    62                 a[i] = a[j];  
    63                 a[j] = temp;  
    64             }  
    65         }  
    66         show(a);
    67         
    68         if (i - base > 1) { // 递归调用,把base前面的完成排序  
    69             quickSort(a, 0, i - 1);  
    70         }  
    71         if (arrEle - j > 1) {  
    72             quickSort(a, j + 1, arrEle); // 递归调用,把base后面的完成排序  
    73         }  
    74         
    75     }
    76     
    77     /**
    78      * @param args
    79      */
    80     public static void main(String[] args) {
    81         // TODO Auto-generated method stub
    82         int[] a={2,4,1,3};
    83         QuickSort.quickSort(a);
    84         System.out.println("最终结果:"+Arrays.toString(a));
    85     }
    86 
    87 }
    快速排序

    4.结果

          原始数组:[2,4,1,3]

    第1次: [1, 2, 4, 3]
    第2次: [1, 2, 3, 4]
    最终结果:[1, 2, 3, 4]

    5.总结

    快速排序采用了「二分法」的思想,采用递归实现。相比冒泡排序,时间复杂度要小很多。

  • 相关阅读:
    高校教师职评
    高校教师曝职评内幕:混行政圈比科研圈更重要
    【50.88%】【Codeforces round 382B】Urbanization
    【64.22%】【codefoces round 382A】Ostap and Grasshopper
    【u253】售货厅
    【u250】manhattan
    【19.77%】【codeforces 570D】Tree Requests
    【t063】最聪明的机器人
    Java Web整合开发(38) -- Log4J
    公网 or 内网
  • 原文地址:https://www.cnblogs.com/helloIT/p/5368401.html
Copyright © 2011-2022 走看看