java 快排_八大排序-快速排序(搞定面试之手写快排)
概要
快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一。其广泛应用的主要原因是高效,核心算法思想是分而治之。快速排序经常会被作为面试题进行考察,通常的考察思路是快排思想、编码实践之手写快排以及进一步对快排的优化。事实上在Java标准库中Arrays类的sort方法里源码也正是使用了优化后的快速排序(具体源码以及优化分析后续会推文讲解),掌握快排算法对于数据结构与算法入门极为重要。
原理
快速排序的核心思想是分治:选择数组中某个数作为基数,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数都比基数小,另外一部分的所有数都都比基数大,然后再按此方法对这两部分数据分别进行快速排序,循环递归,最终使整个数组变成有序。
基数选择
由于快速排序需要选定一个基数进行划分排序,关于基数选择有很多方式,而基数选择直接关系到快排的效率。事实上,选取基准元素应该遵循平衡子问题的原则:即使得划分后的两个子序列的长度尽量相同本篇以待排序数组首元素作为基数进行说明。本篇以最常见的使用数组首元素作为基数进行快速排序原理说明。
一趟排序
以数组int n[] = { 6, 5, 2, 7, 3, 9, 8, 4, 10, 1 }为例:
以第一个数字6作为基数,使用双指针i,j进行双向遍历:
- 1、i从左往右寻找第一位大于基数(6)的数字,j从右往左寻找第一位小于基数(6)的数字;
- 2、找到后将两个数字进行交换。继续循环交换直到i>=j结束循环;
- 3、最终指针i=j,此时交换基数和i(j)指向的数字即可将数组划分为小于基数(6)/基数(6)/大于基数(6)的三部分,即完成一趟快排;
伪代码
见编码注释
编码实践
public class Test {
public static void main(String[] args) {
int n[] = { 6, 5, 2, 7, 3, 9, 8, 4, 10, 1 };
quicksort(n);
System.out.print("快排结果:");
for (int m : n) {
System.out.print(m + " ");
}
}
public static void quicksort(int n[]) {
sort(n, 0, n.length - 1);
}
public static void sort(int n[], int l, int r) {
if (l < r) {
// 一趟快排,并返回交换后基数的下标
int index = patition(n, l, r);
// 递归排序基数左边的数组
sort(n, l, index - 1);
// 递归排序基数右边的数组
sort(n, index + 1, r);
}
}
public static int patition(int n[], int l, int r) {
// p为基数,即待排序数组的第一个数
int p = n[l];
int i = l;
int j = r;
while (i < j) {
// 从右往左找第一个小于基数的数
while (n[j] >= p && i < j) {
j--;
}
// 从左往右找第一个大于基数的数
while (n[i] <= p && i < j) {
i++;
}
// 找到后交换两个数
swap(n, i, j);
}
// 使划分好的数分布在基数两侧
swap(n, l, i);
return i;
}
private static void swap(int n[], int i, int j) {
int temp = n[i];
n[i] = n[j];
n[j] = temp;
}
}
- 结果
快排结果:1 2 3 4 5 6 7 8 9 10
结语
本篇以最简单的形式讲解八大排序之一的快速排序的核心思想和具体实现,快速排序是相对其他排序出现频率最高的排序算法。关于8大排序算法,建议的0基础学习路线是先理解算法思想再进行编码实践。最后,如果觉得本篇对你有所启发或帮助,不妨关注一波0.0
关注订阅号 获取更多干货~
java 快排_八大排序-快速排序(搞定面试之手写快排)相关推荐
- 手写bind_一次搞定前端“四大手写”
本文首发于个人GitHub博客 要问程序员最心虚的面试题,如果要投票选择,手撕代码一定是前三位的.其中在前端领域,以手写 bind.手写深拷贝.手写 EventHub(发布-订阅).手写 Promis ...
- java 面试 框架_这份java集合框架面试题,轻松搞定面试官!
集合框架 1. ArrayList 和 Vector 的区别. 这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集 合,即存储在这两个集合中的元素的位 ...
- java数据类型划分_一张图搞定java数据类型的划分
基本数据类型 byte.short.int.long.float.double.char.boolean Java基本数据类型的大小.范围.默认值 No. 数据类型 大小/位 可表示的数据范围 默认值 ...
- java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目
packageLinkedListSummary; importjava.util.HashMap; importjava.util.Stack; /** * http://blog.csdn.net ...
- ibm软件工程师含金量_令人难以理解的软件工程师:几千行代码能搞定的为什么要写几万行?...
原标题:令人难以理解的软件工程师:几千行代码能搞定的为什么要写几万行? 一 我们公司的 Windows 版软体已经有十多年的历史,经过历代工程师的整治之后,内容已经凌乱不堪.过去三个月,我找时间自己重 ...
- 【面试锦囊】14种模式搞定面试算法编程题(8-14)
面试锦囊之知识整理系列 面试锦囊系列一直有收到大家的反馈,包括后台内推成功的消息.朋友的同事从创业小公司成功跳到huawei等等,非常高兴小破号的这些整理分享能够真正地帮助到大家,以后也会继续.为了更 ...
- 轻松搞定面试中的二叉树题目
版权全部,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比較重要的数据结构,尤其是二叉树.二 ...
- 如何在一分钟内搞定面试官
转载自 如何在一分钟内搞定面试官 很多人的求职面试的过程中都会遇到这个问题: "请做个自我介绍." 有的人,可以口若悬河.妙语连珠讲3分钟,有的人,可能磕磕巴巴,讲了30秒, ...
- 一文搞定面试中的二叉树问题
一文搞定面试中的二叉树问题 版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重 ...
最新文章
- 2019展望:超级智能崛起,人类智慧与机器智能将深度融合
- SQL server Cannot find one or more
- P4331-[BalticOI2004]Sequence数字序列【左偏树】
- Linux基础命令(1)
- JAVA和C#,武当和少林之争!
- Java 垃圾回收机制
- FileZilla Server下载以及安装使用
- android 下载网络图片并缓存
- 著名线性代数教授 85岁麻省理工学院教授,给2020本科生教授《线性代数入门》
- windows下的内存型下载者病毒
- 关闭 Eureka 的自我保护机制
- word在线编辑 linux,Office Online Server 在线编辑Office文档,安装部署
- 如何保障企业邮箱安全
- 光纤收发器结构介绍和故障解决
- 解决高分辨率下安装Linux花屏问题
- mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.
- 2021江苏地区高考成绩排名查询,江苏高考成绩排名查询系统,江苏高考位次排名查询...
- IDEA项目无法引用本地Class类,而且各种报错
- Oracle 11g 未在本地计算机上注册“OraOLEDB.Oracle”提供程序。
- lg的48分之4怎么用计算机算,E算量软件使用教程(48页)-原创力文档