Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)
快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。使用的是递归原理,在所有同数量级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网站更好理解)的更多相关文章
- Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)
原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...
- Java基础-面向对象第一特性之封装(Encapsulation)
Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...
- Java基础系列1:Java基本类型与封装类型
Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...
- 【Java基础】11、java方法中只有值传递,没有引用传递
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...
- 【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 ...
- Java基础(十):封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访 ...
- 夯实Java基础系列5:Java文件和Java包结构
目录 Java中的包概念 包的作用 package 的目录结构 设置 CLASSPATH 系统变量 常用jar包 java软件包的类型 dt.jar rt.jar *.java文件的奥秘 *.Java ...
- java基础学习03(java基础程序设计)
java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
随机推荐
- [qemu] 挂载qcow2文件,qcow2里边还有个lvm
环境:archlinux 背景:在虚拟机里玩dpdk,把挂载HugePage(hugetlbfs)的命令写入fstab的时候,写错了,无法启动,需要把qcow2挂起来改一下. 方法:使用qemu-nb ...
- Jquery元素选取、常用方法;js只能获取内联样式,jquery内联内嵌都可以获取到;字符串.trim();去字符串前后空格
一:常用的选择器: 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(".myC ...
- QLineEdit 仿QQ签名框(思路很独特:用QSS::hover显示额外的图片)
今天鼓捣了半天,终于实现了自定义Qt中的QlineEdit控件的大致效果. 这个问题对于新手而言,主要有以下几个难点: 1.继承QLineEdit控件 2.QSS设置QLineEdit的相关样式,可以 ...
- 在express项目中有效组织和使用mongoose
平凡之路 1.创建express项目 express mongooseExpress 2.最简express var express = require("express"); v ...
- springmvc返回值、数据写到页面、表单提交、ajax、重定向
实验是在前一篇文章的项目上做的: 数据写到页面 后台往前台传数据 TestController添加 /** * 方法的返回值采用ModelAndView, new ModelAndView(" ...
- <转>RowState 介绍
1. RowState 介绍 RowState 是 DataRow 很重要的一个属性, 表示 DataRow 当前的状态. RowState 有 Added, Modified, Unchanged, ...
- angularJs之模块化
<!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...
- LeetCode Basic Calculator II
原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/ Implement a basic calculator to evaluate ...
- 表单设置line-height,在ff中的不垂直居中问题???
在ff中有时候input中的line-height,是有bug存在的,设置了line-height,发现文字并不是垂直居中. 1.这是正常现象,不需要刻意调整样式 2.以后尽量使用button,来避免 ...
- 对memcpy函数的改进
void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&&(src!=NULL)); int ...