quicksort(java版)

相信大家都知道几种排序算法,比如说冒泡排序,选择排序,插入排序等等,这些个算法都不是很难,自己多多理解理解就能掌握了,而今天我们要谈的就是重头戏就是快速排序。

引用大牛的思想来对排序算法解释一下。(文章链接:http://bubkoo.com/2014/01/12/sort-algorithm/quick-sort/#参考文章

快速排序是图灵奖得主C. R. A. Hoare 于 1960 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)

分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

利用分治法可将快速排序的分为三步:

  1. 在数据集之中,选择一个元素作为”基准”(pivot)。
  2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
  3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

下面的简单的介绍一下实现步骤:

上面的图片就是基本实现思路,有点不完全,说的是在快排中基准元素的查找以及定位,基准元素要将比基准元素大的和比基准元素小的要分开,然后一直递归下去,就能实现快排了,本例中基准元素是给定的,而是自己实现的过程中,每次会把第一个元素当成基准元素进行排序。

话不多说,上代码。

 1 public static int getMiddle(int[] a, int low, int high){
 2         //比基准元素小的元素的索引
 3         int storeIndex = 0;
 4         //默认取第一个元素为基准元素
 5         int pivot = a[low];
 6         //先将基准元素移动到数组最后
 7         int tmp = a[low];
 8         a[low] = a[a.length - 1];
 9         a[a.length - 1] =tmp;
10         //将比基准元素小的放到前面,后面跟上比基准元素大的
11         for(int i = 0; i < a.length - 1; i++) {
12             if(a[i] <= pivot){
13                 int temp = a[i];
14                 a[i] = a[storeIndex];
15                 a[storeIndex] = temp;
16                 storeIndex++;
17             }
18         }
19         //将基准元素放回经过筛选元素后的中间位置
20         int temp = a[storeIndex];
21         a[storeIndex] = a[a.length - 1];
22         a[a.length - 1] = temp;
23         //System.out.println(Arrays.toString(a));
24         return storeIndex;
25     }
26
27     public static void quickSort(int[] a, int low, int high) {
28         if(low < high) {
29             int middleIndex = getMiddle(a, low, high);
30             System.out.println(Arrays.toString(a));
31             //分成两组分别快排,递归的思想后面的分组就多了
32             quickSort(a, low, middleIndex - 1);
33             quickSort(a, middleIndex + 1, high);
34         }
35     }

这两个函数就是实现排序,第一个函数是对基准位置的定位,第二是根据基准位置分为两组分别递归,代码中都包含注释,可以根据其更好地理解代码。

如果有何不妥,可以在评论区里交流哦。

时间: 2024-10-18 15:30:12

quicksort(java版)的相关文章

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

Java版贪吃蛇(比较完善的版本)

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了.哈哈. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:http://pan.baidu.com/s/1bnubnzh //Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Gr

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

pureMVC java版搭建流程

转自:http://blog.csdn.net/sutaizi/article/details/6588004 pureMVC 是一个轻量级的框架 它在 flex中非常流行(和cairngorm差不多火) 目前几乎已经移植到所有平台上. 下面实现java版得pureMVC搭建 先给大家看总体的层次: 众所周知 pureMVC是一个轻量级的MVC框架 分为 Model ,View ,Controller.这三个是pureMVC的核心. 除此之外pureMVC中含有一个单例模式Facade.faca

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

应用程序初次运行数据库配置小程序(Java版)

应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的时候自动部署数据库和导入一些初始化数据.然后就有了以下的思路: 在应用程序入口处判断数据库是否已经配置完成,若配置完成则进入正常的登录系统完成正常操作即可,若未配置则进入数据库配置的小程序完成数据库配置然后再进入系统,但如何来判断是否已经配置完成呢,在这里我用的是比较原始的方法,配置数据库的时候系统

微博地址url(id)与mid的相互转换 Java版

原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分(蓝色)为一串貌似随机的字符串. 如果通过方法能计算出蓝色字串与返回的数组里的对应关系则好解决多了. 首先分组蓝色字串 ,从后往前4个字符一组,得到以下三组字符:z8ElgBLeQ 将它们分别转换成62进制的数值则为 35, 2061702, 8999724  将它们组合起来就是一串 3520617

java版的QQ小程序

转载自:http://blog.csdn.net/lihongxun945/article/details/6114290 这是一个简单的java版的QQ小程序. 包括一个简单的服务器和一个简单的客户端. 运行时,先运行服务器,然后在运行客户端,就可以进行聊天了. 默认的配置是localhost,端口4545,更改ip就可以在两天电脑上进行聊天了. 目前不支持内网和外网之间的访问,也不支持多人聊天. 因为这只是一个简单的例子,感兴趣的同学可以通过改进,实现多人聊天和内外网之间的访问. 效果图: