快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

1.算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

2.动图演示

3.代码实现

//javascript实现
function quickSort(arr, left, right) {
var len = arr.length,
partitionIndex,
left =typeof left !='number' ? 0 : left,
right =typeof right !='number' ? len - 1 : right;
if (left < right) {
partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex-1);
quickSort(arr, partitionIndex+1, right);
}
return arr;
} function partition(arr, left ,right) { // 分区操作
var pivot = left, // 设定基准值(pivot)
index = pivot + 1;
for (var i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index);
index++;
}
}
swap(arr, pivot, index - 1);
return index-1;
} function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//java实现
public class QuickSort implements IArraySort { @Override
public int[] sort(int[] sourceArray) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
return quickSort(arr, 0, arr.length - 1);
} private int[] quickSort(int[] arr, int left, int right) {
if (left < right) {
int partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
return arr;
} private int partition(int[] arr, int left, int right) {
// 设定基准值(pivot)
int pivot = left;
int index = pivot + 1;
for (int i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index);
index++;
}
}
swap(arr, pivot, index - 1);
return index - 1;
} private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} }

最新文章

  1. R语言自动化
  2. [转]FINDSTR正则表达式小结
  3. JSON Web Token实际应用
  4. 获取SqlServer存储过程定义的3种方法
  5. 3.创建第一个android项目
  6. Bash Shell read file line by line and substring
  7. CentOS6 Squid代理服务器的安装与配置
  8. laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块
  9. 局域网接入Internet
  10. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA
  11. html禁止手机页面放大缩小
  12. iframe 标签自适应高度和宽度
  13. poj2578---三个数中找出第一个大于168的
  14. Javascript 内核Bug
  15. 自己封装的一个类似axios的请求
  16. jquery对复选框(checkbox)的操作(精华)
  17. Spark多种运行模式
  18. canvas学习之折线图
  19. 求N的阶乘N!中末尾0的个数
  20. 记一次使用SecureCRT连接局域网巨慢的问题

热门文章

  1. 左手Cookie“小甜饼”,右手Web Storage
  2. JavaScript の 内容属性(HTML属性attribute)和 DOM 属性(property)
  3. 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面
  4. Javascript Symbol 隐匿的未来之星
  5. C#编写程序,计算数组中奇数之和和偶数之和
  6. Python中使用正则表达式获取两个字符中间部分
  7. java1.7之后的比较器特别之处
  8. Smith数的判断
  9. Android:setOnItemClickListener cannot be used with a spinner报错
  10. MySQL8.0官方文档学习