1.  快排算法思路

基本思想:通过一趟快速排序将待排数组分割成独立的两份部分; 其中一部分数组的值均比另一部分数组的值小,则可分别对着两部分数组继续进行排序,以达到整个序列有序。

快排的平均时间复杂度为n*log(n),最坏的时间复杂度为 n^2。

一趟快速排序:首先先选一个值(通常选择数组第一个值)作为枢轴,然后按下述原则重新排列其余的值,将数组中所有小于枢轴的值放在枢轴前面,数组中所有大于枢轴的值放在枢轴后面。将枢纽最后的位置作为分界线,将数组分成两部分(两部分均不包含枢轴),这个过程称作一趟快速排序。

一趟快速排序的具体做法

1.  设两个指针 low 和 high , 他们的初始值分别为数组开始的下标 start,数组结束的下标end

2.  枢轴值为 pivotKey

3.   则首先从 high 所指位置向前搜索,搜索到第一个小于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换。

4.  从 low 所指位置向后搜索,搜索到第一个大于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换。

5.  重复前两步操作(3,4),直至 low == high 。

2.  Java 代码实现

完全按照上面的思路的 Java 代码如下:

package sort;/*** 快速排序(Quick Sort) Java代码实现* 快排时间复杂度:n*log(n)*/public class MySort {public static void main(String args[]) {int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27};MySort mySort = new MySort();System.out.print("排序前的数组: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的结果: ");PrintArray(arr, 0, arr.length-1);}/*** 对数组 arr 下标从 start 到 end 的内容进行排序* @param arr:待排序数组* @param start:开始的下标* @param end:结束的下标*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.  设两个指针 low 和 high ,他们的初始值分别为数组开始的下标 start,数组结束的下标endint low = start;int high = end;// 2.  枢轴值为 pivotKeyint pivotKey = arr[start];// 5. 重复前两步操作(3,4),直至 low == highwhile (low<high) {// 3. 首先从 high 所指位置向前搜索,搜索到第一个小于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换while (low<high && arr[high]>=pivotKey) {--high;}int temp1 = arr[low];arr[low] = arr[high];arr[high] = temp1;// 4. 从 low 所指位置向后搜索,搜索到第一个大于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换。while (low<high && arr[low]<=pivotKey) {++low;}temp1 = arr[low];arr[low] = arr[high];arr[high] = temp1;}// 对 小于枢轴值的那部分数组值 进行快排quickSort(arr, start, low-1);// 对 大于枢轴值的那部分数组值 进行快排quickSort(arr, low+1, end);}/***输出数组中的值* @param arr:数组* @param start:数组开始的下标* @param end:数组结束的下标*/public static void PrintArray(int[] arr, int start, int end) {for (int i=start; i<=end; i++) {System.out.print(arr[i] + " ");}System.out.println("");}
}

运行可得 :

3.  简单的优化

进行一次数值交换,如 :temp1 = arr[low]; arr[low] = arr[high]; arr[high] = temp1,需要三次赋值,temp1 = arr[low]; arr[high] = temp1 这两次赋值其实是多余的,因为 当 low == high , 也就是最终的位置 low ,就是枢轴值的位置,我们只需要在一次快排结束后将枢轴值放到 low 位置就可以了。Java源码如下。

package sort;/*** 快速排序(Quick Sort) Java代码实现* 快排时间复杂度:n*log(n)*/public class MySort {public static void main(String args[]) {int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27};MySort mySort = new MySort();System.out.print("排序前的数组: ");PrintArray(arr, 0, arr.length-1);mySort.quickSort(arr, 0, arr.length-1);System.out.print("排序后的结果: ");PrintArray(arr, 0, arr.length-1);}/*** 对数组 arr 下标从 start 到 end 的内容进行排序* @param arr:待排序数组* @param start:开始的下标* @param end:结束的下标*/public static void quickSort(int[] arr, int start, int end) {if(start >= end) {return;}// 1.  设两个指针 low 和 high ,他们的初始值分别为数组开始的下标 start,数组结束的下标endint low = start;int high = end;// 2.  枢轴值为 pivotKeyint pivotKey = arr[start];// 5. 重复前两步操作(3,4),直至 low == highwhile (low<high) {// 3. 首先从 high 所指位置向前搜索,搜索到第一个小于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换while (low<high && arr[high]>=pivotKey) {--high;}arr[low] = arr[high];// 4. 从 low 所指位置向后搜索,搜索到第一个大于 pivotKey 的 值,然后将这个值和  pivotKey 互相交换。while (low<high && arr[low]<=pivotKey) {++low;}arr[high] = arr[low];}// 一次快排结束后将枢轴值放到 low 位置arr[low] = pivotKey;// 对 小于枢轴值的那部分数组值 进行快排quickSort(arr, start, low-1);// 对 大于枢轴值的那部分数组值 进行快排quickSort(arr, low+1, end);}/***输出数组中的值* @param arr:数组* @param start:数组开始的下标* @param end:数组结束的下标*/public static void PrintArray(int[] arr, int start, int end) {for (int i=start; i<=end; i++) {System.out.print(arr[i] + " ");}System.out.println("");}
}

运行截图 :

4.  优化措施

优化最坏的情况:在选择枢轴,取数组的第一个元素、中间的那个元素、最后一个元素的中位数作为枢轴。

优化最好的情况:添加两个 布尔类型 变量,如果 指针low 从低端向中间的移动过程中没有交换记录,则不需要对枢轴左部分的元素排序;如果 指针high 从高端向中间的移动过程中没有交换记录,则不需要对枢轴右部分的元素排序,这样就可能达到n的时间复杂度。

5.  参考文献

数据结构 -  严蔚敏、吴伟民 -  清华大学出版社

快排Java代码实现(Quick Sort)相关推荐

  1. 快排——Java实现快速排序代码

    快排作为最常用的排序算法,他主要是以一个数为基准数,将数组中的其他数按一定的顺序放入两边.以从小到大排序为例,快排的操作就是将比基准数小的都放到它的左边,比基准数大的都放到它的右边,然后左右两边再分别 ...

  2. java三路快排,java二路快排很慢

    老师,以下是我二路快排的java代码 public class quickSortTwoway { public quickSortTwoway() {}; public static void qu ...

  3. 快排--java实现

    快速排序思想 快速排序的思想,寻找一个轴位,比这个轴小的放到左边,比这个轴大的放到右边,然后分别再对两边进行如此的方法即可得到排序的数组. 这样说起来晦涩难懂,我们举个例子来实现. 例如数组:{13, ...

  4. 快排java实现图文解释

    先上代码: /******************************************************* *快速排序 (比较排序类) *每次排序将待排记录分割两部分,一部分都比关键 ...

  5. 运行sql快还是java代码快,让Java代码跑得更快

    1.将一些系统资源放在池中,如数据库连 接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应 用这可以使用服 ...

  6. Java实现快速排序 Quick Sort

    本文带来八大排序算法之快速排序算法. 快速排序(QuickSort)是对冒泡排序的一种改进.基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小, ...

  7. 快排优化代码__2018.07.26

    代码: ======4.快速排序优化============== int Partion(int *arr,int low,int high) {int tmp = arr[low]; while(l ...

  8. java快排(java快排函数)

    java培训机构排名动力节点排第几? 没有排名,在我心里他是第一,现在都做了10年了,我15年就毕业了,一转眼过去四年了,学校的课程还是跟以前一样每隔一段时间就更新,这段时间的架构师课程对我帮助就很大 ...

  9. Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

最新文章

  1. 高科技领域零的突破永不嫌多 --- 我看嫦娥四号成功登陆月球背面
  2. springmvc过滤器简单实例
  3. Linux 给用户添加sudo权限
  4. group by很多字段是不是会很慢_女生回复我总很慢,怎么办?
  5. vue使用echarts图表
  6. Eclipse JPBC library安装及测试
  7. Java加密压缩文件
  8. Scrapyd API的安装
  9. c盘local文件太大_win7 c盘清理的方法教程
  10. 参考文献的引用的格式
  11. 单片微型计算机原理和应用答案,《单片微机原理及应用》 试卷A及参考答案
  12. 每台计算机需要配置网关吗,怎么设置一台电脑作为网关
  13. 报告:加密货币和石油市场暴跌是市场接近“闪电崩盘”的标志
  14. 全站仪和手机连接软件_南方全站仪传输软件-南方全站仪传输软件下载 1.0 中文版 - 河东下载站...
  15. 不同的丘脑皮层网络动力学与慢性腰痛的病理生理学有关
  16. 利用傅里叶变换去除图像中有规律的噪声
  17. JAVA学习路线图 【黑马版】
  18. 无法连接到已配置的开发web服务器_Power BI 报表服务器极简安装指南
  19. 穷人要如何翻身?富人要如何更富?穷人应怎么做才能跟上时代实现“草根创业”?
  20. 走进沃尔玛物流EDI

热门文章

  1. 如何办理移动飞享8元套餐
  2. 奇遇网:WordPress版微信小程序开发:安装使用问题
  3. Android逆向分析(一) - 反编译看看手Q口令红包的实现原理
  4. 静态分析工具Cppcheck在Windows上的使用
  5. Jira使用Docker方式部署
  6. macOS BigSur 正式版上线!有哪些变化和新功能,是否值得更新?
  7. 三角函数泰勒公式推导
  8. 带螺纹的注塑件如何脱模,你说难吗?
  9. Python-3D图表
  10. Linux - 生产故障、性能评估面试题