快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好。就平均时间而言,是目前被认为最好的一种内部排序方法

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

三个指针: 第一个指针称为pivotkey指针(枢轴),第二个指针和第三个指针分别为left指针和right指针,分别指向最左边的值和最右边的值。left指针和right指针从两边同时向中间逼近,在逼近的过程中不停的与枢轴比较,将比枢轴小的元素移到低端,将比枢轴大的元素移到高端,枢轴选定后永远不变,最终在中间,前小后大。

需要两个函数:

① 递归函数  public static void quickSort(int[] array, int left, int right) {}

② 分割函数(一趟快速排序函数)public static int partitionByPivotValue(int[] array, int left, int right) {}

 package lsg.ap.quick;
 import java.util.Random;
 public class QuickSort
 {

     /**
      * 先按照数组为数据原型写出算法,再写出扩展性算法。数组
      *
          基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比
          另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序
          过程可以递归进行,以此达到整个数据变成有序序列。
      */
     public static void quickSort(int[] array, int left, int right)
     {
         int pivotKey;
         if (left < right)
         {
             pivotKey = partitionByPivotValue(array, left, right);
             // 对左右数组递归调用快速排序,直到顺序完全正确
             quickSort(array, left, pivotKey - 1);
             quickSort(array, pivotKey + 1, right);
         }
     }  

     /**
      * pivotValue作为枢轴,较之小的元素排序后在其左,较之大的元素排序后在其右
      *
      * @param array
      * @param left
      * @param right
      * @return
      */
     public static int partitionByPivotValue(int[] array, int left, int right) {
         int pivotValue = array[left];//提前把枢轴值取出,防止后面移动元素时元素被覆盖导致丢失
         // 枢轴选定后永远不变,最终在中间,前小后大
         while (left < right)
         {
             while (left < right && array[right] >= pivotValue)
             {
                 --right;
             } //while循环的作用就是一直到 array[right] < pivotValue跳出
             // 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
             array[left] = array[right];//array[left]枢值已经被第一句提前取出保存了
             while (left < right && array[left] <= pivotValue)
             {
                 ++left;
             }//while循环的作用就是一直到 array[right] > pivotValue跳出
             // 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
             array[right] = array[left];
         }
         // 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上
         array[left] = pivotValue;
         return left;
     }
     /**
      *
      * 输出相应数组的结果
      * @param array
      */
     private static void printArray(int[] array)
     {
        for(int value:array)
         System.out.print(" "+value+" ");
       System.out.println();
     }
     public static void main(String[] args)
     {
         // TODO Auto-generated method stub
         //小数据量的测试
                 int[] array=new int[]{8,3,2,1,7,4,6,5};
                 //下面是大数据量的测试。这样才能看出不同算法的优劣
                 Random random=new Random();
                 int[] array2=new int[2000];
                 for(int j=0;j<2000;j++)
                 {
                     array2[j]=random.nextInt(100000);
                 }
          //输出原数组的内容
         System.out.println("排序前数组元素为:");
         printArray(array);
         long dateStart=System.nanoTime();
         //归并排序操作
         quickSort(array,0,array.length-1);

         long dateEnd=  System.nanoTime();
         long totalTime=dateEnd-dateStart;
          System.out.println("快速排序的时间复杂度为:");
          System.out.println(totalTime+"纳秒");
         //输出排序后的相关结果
          System.out.println("排序后数组元素为:");
          printArray(array);
     }

 }

Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)的更多相关文章

  1. Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)

    原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...

  2. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

  3. Java基础系列1:Java基本类型与封装类型

    Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...

  4. java 基础知识一 初识java

    java  基础知识一初识java 1.java语言的特点 (1)简洁有效(2)可移植性(3)面向对象(4)解释型(5)适合分布式计算 2.java的源文件扩展名为.java 编译后的扩展名为.cla ...

  5. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  6. 【Java基础】4、java中的内部类

    内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  7. Java基础(十):封装

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访 ...

  8. 夯实Java基础系列5:Java文件和Java包结构

    目录 Java中的包概念 包的作用 package 的目录结构 设置 CLASSPATH 系统变量 常用jar包 java软件包的类型 dt.jar rt.jar *.java文件的奥秘 *.Java ...

  9. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

随机推荐

  1. 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...

  2. 2小时入门Robot Framework

    1.介绍 1.1.介绍Robot Robot Framework是一个基于关键字驱动的自动化测试框架.通过该框架,测试人员可使用python封装关键字,并在非代码环境下使用关键字构建可被执行的测试用例 ...

  3. linux输入输出重定向

    http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据 ...

  4. 关于Css选择器优先级

    今天练习css的时候,重叠后的style发现不起作用,原来css选择器优先级大有文章. 声明: yi下内容选自 51cto.com  --加以自己的理解 以备日后参照使用,毕竟自己理解的才是自己的. ...

  5. selenium更加高效的PageObject 对象操作代码

    重新封装了的selenium代码,包括click事件,sendkeys事件,select事件,以及对readonly日期控件的处理 package com.common; import java.ut ...

  6. Easyui后台管理角色权限控制

    最近需要做一个粗略的后台管理的权限,根据用户的等级来加载相应的菜单,控制到子菜单.使用的是Easyui这个框架. 1.我使用的mysql数据库.在这里我就建立四张表,角色表(tb_users),菜单表 ...

  7. C# 通俗说 哈希表

    1.何谓哈希 哈希,也程散列.哈希表是一种与数组,链表等不同的数据结构,与他们需要不断的 遍历比较查找的办法,哈希表设计了一个映射关系发f(key)=adress,根据key来计算adress, 这样 ...

  8. Centos7 nginx 虚拟主机、反向代理服务器及负载均衡,多台主机分离php-fpm实验,之强化篇,部署zabbix为例

    一.简介 1.由于zabbix是php得,所有lnmp环境这里测试用的上一个实验环境,请查看https://www.cnblogs.com/zhangxingeng/p/10330735.html : ...

  9. android 模拟器无法启动问题

    很早之前就碰到过Android Studio模拟器无法启动的问题,今天终于尝试去解决了下,下面将我解决的方法记录下. 模拟器报错信息为: emulator: ERROR: x86 emulation ...

  10. [HTML5&amp;amp;CSS3]Transform具体解释

    Transform字面上就是变形,改变的意思. 在CSS3中transform主要包含以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.以下我们 ...