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.总结

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

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/helloIT/p/5368401.html
Copyright © 2011-2022 走看看