快速排序:通过一趟排序,将数据分为两部分,其中一部分中的所有数据比另外一部分的所有数据要小,然后按照此方法,分别对这两部分进行排序,达到最终的排序结果。

每趟排序选取基准元素,比该基准元素大的数据放在一边,比该基准元素小的数据放在另一边,这种处理方式称为分治法。

数据的移动是基准元素中比较重要的点,有两种方式实现,挖坑填数法和指针交换法

挖坑填数法

(下图中单词有两处拼写错误,pviot和pvoit应该为pivot)

如下为代码实现

import java.util.Arrays;

public class QuickSort {
public static void main(String[] args) {
int[] arr = { 12, 45, 23, 67, 7, 1, 5, 21 };
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
} public static void quickSort(int[] arr, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
} int partitionIndex = getPartitionIndex(arr, startIndex, endIndex); quickSort(arr, startIndex, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, endIndex); } public static int getPartitionIndex(int[] arr, int startIndex, int endIndex) {
int index = startIndex;
int left = startIndex;
int right = endIndex;
int pivot = arr[startIndex]; while (left < right) {
while (left < right) {
if (arr[right] < pivot) {
arr[index] = arr[right]; // 找到所需值,将值填充到坑位
index = right; // 此时right位置为index新坑位
left++; // 右侧找到了数据,则left右移一位,准备进行比对
break; // 找到数据之后,跳出内循环,准备从左侧开始对比
}
// 没有匹配的数据,则right左移一位,继续对比
right--;
} while (left < right) {
if (arr[left] > pivot) {
arr[index] = arr[left]; // 找到所需的值,将值填充到坑位
index = left; // 此时left位置为index新坑位
right--; // 左侧找到了数据之后,right向左移动一位,准备进行比较
break; // 找到数据之后,跳出内循环,准备从左侧开始对比
}
// 没有匹配的数据,则left右移一位,继续对比
left++;
}
} // 最后将pivot放入index位置
arr[index] = pivot;
return index;
} }

指针交换法

代码实现如下

import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = { 12, 45, 23, 67, 7, 1, 5, 21 };
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
} public static void quickSort(int[] arr, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
} int partitionIndex = getPartitionIndex(arr, startIndex, endIndex); quickSort(arr, startIndex, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, endIndex); } public static int getPartitionIndex(int[] arr, int startIndex, int endIndex) {
int left = startIndex;
int right = endIndex;
int pivot = arr[startIndex]; while (left != right) { // 左侧索引必须小于右侧索引,当右侧数据大于基准元素,则将右侧元素向左移动一位,继续判断,直到找到比基准元素小的数据
while (left < right && arr[right] > pivot) {
right--;
} // 左侧索引必须小于右侧索引,当左侧数据小于等于基准元素,则将左侧元素右移一位,继续判断,直到找到比基准元素大的数据位置
while (left < right && arr[left] <= pivot) { // 此处必须是左侧元素“小于等于”基准元素
left++;
} if (left < right) {
// 通过以上两轮while循环,已经找到左侧大于基准元素的数据和右侧小于基准元素的数据,交换它们
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
} // 此时right和left值是相同的,将基准元素与重合位置元素交换
arr[startIndex] = arr[left];
arr[left] = pivot;
return left;
}
}

讨论

1、以上两种方式只有在获取分区索引的代码不一样,其他都一样

2、指针交换法中,第二个内层while循环为什么必须要小于等于基准元素才行?

假设去掉等于,那么我们从左侧取的第一个值是12,pivot为12,则arr[left]<pivot条件不成立,那么则left的值就不会变化,此时在下面的交换中,arr[left]的值始终不变,最终的排序结果也将是错误的,所以需要是小于等于基准元素

3、以上两种方式是否有优化空间

在两种处理方式的getPartitionIndex方法返回值前添加打印数组语句,输出结果分别为

挖坑填数法输出

[5, 1, 7, 12, 67, 23, 45, 21]
[1, 5, 7, 12, 67, 23, 45, 21]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]

指针交换法输出

[7, 5, 1, 12, 67, 23, 45, 21]
[1, 5, 7, 12, 67, 23, 45, 21]
[1, 5, 7, 12, 67, 23, 45, 21]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]
[1, 5, 7, 12, 21, 23, 45, 67]

可以发现,挖坑填数法,在第三次输出时已经是一个有序集合了,指针交换法在第四次输出后也是一个有序集合,所以上述两种代码可以进行优化处理

优化,待添加。。。。。。

使用java实现快速排序(挖坑填数法和指针交换法)的更多相关文章

  1. java实现第三届蓝桥杯方块填数

    方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部 ...

  2. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  3. 蛇形填数(JAVA语言)

    package 第三章; import java.util.Scanner; public class 蛇形填数 { public static void main(String[] args)  { ...

  4. java算法 蓝桥杯(题+答案) 方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  5. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  6. java实现第六届蓝桥杯五星填数

    五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...

  7. java实现第七届蓝桥杯方格填数

    方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...

  8. java实现第五届蓝桥杯六角填数

    六角填数 题目描述 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不 ...

  9. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

随机推荐

  1. TCP 三次握手与四次断开

    三次握手建立连接 TCP连接是通过三次握手来连接的. 第一次握手 当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为x,等待服务器确认,这时客户端的状态为SY ...

  2. Spotlight on Mysql在Windows平台下的安装及使用简介

    Spotlight on Mysql在Windows平台下的安装及使用简介   by:授客 QQ:1033553122 1.   测试环境 Win7 64位 mysql-connector-odbc- ...

  3. Android为TV端助力 Intent匹配action,category和data原则

    1.当你在androidmanifest里面定义了一个或多个action时 你使用隐式意图其他activity或者service时,规定你隐式里面的action必须匹配XML中定义的action,可以 ...

  4. js实现获取当前时间是本月第几周和年的第几周的方法

    js实现获取当前时间是本月第几周和年的第几周的方法 获取本月第几周的方法: var getMonthWeek = function (a, b, c) { /** * a = d = 当前日期 * b ...

  5. Android深入四大组件(九)Content Provider的启动过程

    前言 Content Provider做为四大组件之一,通常情况下并没有其他的组件使用频繁,但这不能作为我们不去深入学习它的理由.关于Content Provider一篇文章是写不完的,这一篇文章先来 ...

  6. 闭包,jQuery插件的写法:图片预加载

    最近做的一些网页,单个网页图片量都比较大,网络不好的情况下,特别卡,这个图片预加载的方法可以牺牲一些时间换来网页的浏览顺畅,还是值得的. //闭包的写法,它内部的变量都是局部的,不会和外部巳有的变量进 ...

  7. mysql之全球化和本地化:字符集、校对集、中文编码问题

    本文内容: 什么是字符集?什么是校对集? 查看字符集和校对集 设置字符集和校对集 mysql中的中文数据问题 首发日期:2018-04-19 什么是字符集?什么是校对集? 字符集是字母和符号的集合,每 ...

  8. Git忽略规则及.gitignore规则不生效的解决办法(转)

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: 1 2 3 ...

  9. JMS Session session = connection.createSession(paramA,paramB) 两个参数不同组合下的含义和区别

    Session session = connection.createSession(paramA,paramB); paramA是设置事务,paramB是设置acknowledgment mode ...

  10. 洗礼灵魂,修炼python(78)--全栈项目实战篇(6)—— 多级目录菜单之地址管理系统

    相信各位都在在网上买过东西吧?那么今天我的主题就是写个在线购物系统,是不可能的,哈哈(后期确实有这个项目),那么购物都填写过快递地址吧?然后网上查个地址都有地址管理吧? 要求: 1.打印出省.市.县等 ...