快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中所有元素小于pivot,L[k+1...n]中所有元素大于或等于pivot,则pivot放在最终位置L(k)上,这个过程称一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终的位置上。

首先假设划分算法已知,记为partition(),返回的是上述中的k,注意到L(k)已经在最终的位置,所以可以先对表进行划分,而后对两个表调用相同的排序操作。因此可以递归地的调用快速排序算法进行排序,具体的程序结构如下:

1 public static void quickSort(int[] array, int low, inthigh) {2 if (low < high) {//递归跳出的条件

3 int pivotpos =partition(array, low, high);4 //partition()即是划分操作,将表划分为两个子表

5 quickSort(array, low, pivotpos - 1);6 quickSort(array, pivotpos + 1, high);//依次对两个子表进行递归

7 }8 }

从上面的代码也不难看出快速排序算法的关键在于划分操作,同时快速排序算法的性能也主要取决于划分操作的好坏。本人参考严蔚敏老师所著教材上的划分操作思想,假设每次总是以当前表中第一个元素作为枢纽(基准)对表进行划分,则必须将表中比枢纽值大的元素向右移动,比枢纽值小的元素向左移动,使得一趟partition()操作之后,表中的元素被枢纽值一分为二。

//严版教材中的划分算法(一趟排序过程)

public static int partition(int[] array, int low, inthigh) {int pivot = array[low];//将表中第一个元素设为枢纽值,对表进行划分

while (low < high) {//循环跳出条件

while (low < high && array[high] >=pivot) {

high--;//将比枢纽值小的元素移动到右端

}

array[low]=array[high];while (low < high && array[low] <=pivot) {

low++;//将比枢纽值大的元素移动到左端

}

array[high]=array[low];

}

array[low]= pivot;//将枢纽元素放回最终位置

return low;//返回存放枢纽的最终位置

}

运行下试试:

int[] arr = new int[]{43, 25, 71, -42, 45, -69, 11, 31, 29, -4, 0, -17, 21};

将该数组进行快排

/*数组的快速排序*/

public classquickSort {public static voidmain(String[] args) {int[] arr = new int[]{43, 25, 71, -42, 45, -69, 11, 31, 29, -4, 0, -17, 21};

System.out.println("排序前:");for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+ " ");

}

quickSort(arr,0, arr.length - 1);

System.out.println();

System.out.println("排序后:");for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+ " ");

}

}public static void quickSort(int[] array, int low, inthigh) {if (low

quickSort(array, low, pivotpos- 1);

quickSort(array, pivotpos+ 1, high);

}

}//严版教材中的划分算法(一趟排序过程)

public static int partition(int[] array, int low, inthigh) {int pivot = array[low];//将表中第一个元素设为枢纽值,对表进行划分

while (low < high) {//循环跳出条件

while (low < high && array[high] >=pivot) {

high--;//将比枢纽值小的元素移动到右端

}

array[low]=array[high];while (low < high && array[low] <=pivot) {

low++;//将比枢纽值大的元素移动到左端

}

array[high]=array[low];

}

array[low]= pivot;//将枢纽元素放回最终位置

return low;//返回存放枢纽的最终位置

}

}

结果是正确的

java 快速排序算法简单_Java 快速排序算法的简单说明及实现相关推荐

  1. java g1 详解_JAVA垃圾收集算法总结以及CMS、G1算法详解

    前段时间由于工作原因一直很忙,上周项目验收后时间终于空闲下来,博客也有好几个月没有更新了,趁着还有几天放假,借这个机会写点东西:网上也有很多人写过Java垃圾收集器,特别现在主流比较火的CMS和G1算 ...

  2. java求公式例题_JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  3. java java算法题目_java常见算法题目

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  4. java快速排序的时间复杂度_java 快速排序

    思路 通过一趟排序,将要排序的数据分隔成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此使整个数据变成有序序 ...

  5. java经典50题_JAVA经典算法50题(3)【面试+工作】

    原标题:JAVA经典算法50题(3)[面试+工作] JAVA经典算法50题(3)[面试+工作] [程序21] 题目:求1+2!+3!+...+20!的和. 1.程序分析:此程序只是把累加变成了累乘. ...

  6. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

  7. Java算法大全_java贪心算法几个经典例子

    Java经典问题算法大全   /*[程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?  ...

  8. java工作两年可以转算法吗_java转算法后平淡的一年(迷茫2019)

    不想再写悲惨了,还是迷茫更可怕一点.为啥感觉不到惨了呢?可能是麻木了吧,也可能是这一年实在是没啥起伏.每天都差不多是吃饭.上班.吃饭.下班.吃饭.轻微锻炼.节假日激烈的锻炼锻炼.集中相亲又败了一小波, ...

  9. java程序算法实例_java编程算法经典案例

    编程经典案例(持续更新中,敬请期待): 一.购物问题 小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥.面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超 ...

  10. java经典算法大全_JAVA 经典算法大全:PageRank算法

    public class PageRank { private static double alpha = 0.85; /** * PageRank vector q is defined as q ...

最新文章

  1. 13个你一定要知道的PyTorch特性
  2. Windows 驱动开发资源链接
  3. python opencv 4.1.0 cv2.convertScaleAbs()函数 (通过线性变换将数据转换成8位[uint8])(用于Intel Realsense D435显示depth图像)
  4. consul历史版本下载地址
  5. ABAP文档生成工具
  6. Shell Pyramid【数学+二分】
  7. 最具价值中国品牌百强榜单发布 小米首次入围排名第11位
  8. Echart.js的趋势图入门与实例
  9. Hive UDF开发
  10. 产业互联网周报:滴滴被处以80亿元巨额罚款;消息称中国正启动欧洲企业到中国上市计划;字节跳动确认自研专用芯片...
  11. win7QQ安装包可能被非法改动导致安装失败怎么办
  12. HEVC与AVC的区别与联系(十二),Android面试题集锦在这里
  13. 计算机word排版实训报告,Word排版实训报告
  14. Math.random随机数生成公式
  15. 东南大学计算机网络安全中心,胡轶宁 - 东南大学 - 网络空间安全学院
  16. 离职后的总结与感想(一)
  17. 全志定制编译Android,全志H3 Android定制化文档
  18. 计算机桌面操作系统版本,如何看电脑操作系统版本
  19. Nodejs版本更新
  20. E-PUCK机器人-软件

热门文章

  1. 使用flask开发web应用
  2. 【WinRT】使用 T4 模板简化字符串的本地化
  3. 从php的生命周期来优化页面响应时间
  4. ActiveMQ(三)——JMS消息结构、JMSReplyTo、面试题(消息丢失,消息重复,消息顺序)
  5. JVM监控及诊断工具GUI篇之Visual VM
  6. MyBatis源码阅读(八) --- Executor执行器
  7. ConcurrentModificationException---异常剖析
  8. Maven搭建SpringMVC+Hibernate项目详解
  9. Mysql Too many connections解决方案
  10. js面向对象练习(二):JS面向对象的思路(canvas)写躁动的小球