算法思想

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

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

(2)快速排序的基本思想
     设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
分解: 
     在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
  注意:
     划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
     R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                  其中low≤pivotpos≤high。
求解: 
     通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。

组合: 
     因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

代码实现(Java)

 public class QuickSort {

     private Double[] source;
private int TYPE;
private Object result; public QuickSort(Double[] source) { //Double类型构造
this.source = source;
result = source;
TYPE = 0;
}
public QuickSort(double[] source) { //double类型构造
this.source = new Double[source.length];
for (int i = 0; i < source.length; i++) {
this.source[i] = source[i];
}
result = source;
TYPE = 1;
}
public QuickSort(int[] source) { //int类型构造
this.source = new Double[source.length];
for (int i = 0; i < source.length; i++) {
this.source[i] = (double) source[i];
}
result = source;
TYPE = 2;
} public void sort() {
if (source != null) {
sort(0, source.length - 1);
switch (TYPE) {
case 0:
break;
case 1:
{
for (int i = 0; i < source.length; i++) {
((double[]) result)[i] = source[i].doubleValue();
}
}
break;
case 2:
{
for (int i = 0; i < source.length; i++) {
((int[]) result)[i] = source[i].intValue();
}
}
break;
}
}
} /**
* @param left : 左指针
* @param right : 右指针
* @category 递归排序
* */
private void sort(int left, int right) {
if (right <= left) return;
int l = left; //左边界
int r = right; //右边界
double base = source[left]; //参照数
boolean done = true; //上一轮是否进行了交换,这里定义,每进行一次定方向的比较查找 就算是一轮
while (left < right) {
//倒序
if (!done) break;
done = false;
for (int i = right; i > left; i--) {
if (source[i] < base) { //这里的base肯定指向 source[left],不然不会进行到【倒序】
double t = source[left];
source[left] = source[i];
source[i] = t;
right = i;
done = true;
break;
}
}
//正序
if (!done) break;
done = false;
for (int i = left; i < right; i++) {
if (source[i] >= base) { //这里的base肯定指向 source[right],不然不会进行到【正序】
double t = source[right];
source[right] = source[i];
source[i] = t;
left = i;
done = true;
break;
}
}
}
//递归
if (source[left] == base) {
sort(l, left - 1);
sort(left + 1, r);
} else {
sort(l, right - 1);
sort(right + 1, r);
}
}
}

测试代码

 public class Test {

     /**
* @author Wfei
*/
public static void main(String[] args) {
int[] source_int = new int[20];
Double[] sourceDou = new Double[20];
double[] source_dou = new double[20];
for (int i = 0; i < source_int.length; i++) {
int t = (int) (Math.random() * 20);
source_int[i] = t;
sourceDou[i] = (double) t;
source_dou[i] = (double) t;
}
long beginTime;
long endTime; printData(source_int);
QuickSort quickSort = new QuickSort(source_int); beginTime = new Date().getTime();
quickSort.sort();
endTime = new Date().getTime(); printData(source_int);
System.out.println("耗时 : " + (endTime - beginTime) + " 毫秒");
} private static void printData(int[] source) {
for (int i = 0; i < source.length; i++) {
if (i % 10000 == 0) {
System.out.println("");
}
System.out.print(source[i] + " , ");
}
System.out.println("");
}
}

声明:以上实现,纯属个人初次学习《快速排序》思想所得,暂未参见其他前辈高明的实现算法思想,持续学习更新中!

引用:快速排序理论思想,请参见:http://www.cnblogs.com/foreverking/articles/2234225.html

排序算法 - 快速排序(Quick Sort)的更多相关文章

  1. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  2. 排序:快速排序Quick Sort

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

  3. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  4. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  5. Python排序算法——快速排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10768593.html 排序算法(Sortin ...

  6. 快速排序Quick sort

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

  7. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  8. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  9. 经典排序算法 - 基数排序Radix sort

    经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...

随机推荐

  1. Log4Net_LayOut

    对Log4Net做了些基本记录 其中Layout常用参数的解释,我已实例为准. 测试程序源码如下: static void Main(string[] args) { log4net.Config.X ...

  2. Swift 断言

    assert(条件,"输出信息"); 如: let age=-1; assert(age>=0,"age要大于0");

  3. jQuery滚动广告 解决子div绝对定位与父div重叠引起的闪烁问题

    这两天做了一个滚动广告栏的demo 功能有自动轮播 左右箭头移动 导航点选中图片移动效果 模仿的是新浪体育的广告 最难的问题就是子div绝对定位于父div 鼠标移入子div 系统会判定鼠标移出了父di ...

  4. less的学习(css)

    因为新公司需要用less来写样式,对于用惯了css的我来说还是觉得有点麻烦 但是呢,都是有个过程嘛,学习必须走起嘛. 写到半中央发现一个写的特别好的less帖子,就不写. http://www.w3c ...

  5. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

    xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...

  6. 初识JavaScript,感觉整个人都不好了。。。

    学习web前端的开发已经将近一个月了,开发中的三个大兄弟——“html”.“css”.“JavaScript”,小哥我已经深入接触了前两位,并与他俩建立的深厚的友谊.在编写过程中,不能说达到各位大神的 ...

  7. Javascript 匀速运动——应用案例:网站常用功能分享到

    网站上会经常用到Javascript 中的运动,这次与大家分享一下一些运动的基本应用 . 方便大家在开发中能够直接使用. 代码简单易懂,适用于初学者.最后会一步一步整理出一套自己的运动框架. 应用案例 ...

  8. windows中copy命令详解

    功能:将一份文件或者多份文件复制到另一个位置 用法: copy [/D] [/V] [/N] [/Y|/-Y] [/Z] [/A | /B] source [/A | /B] [+ source [/ ...

  9. Latex命令笔记

    1.\documentclass[hyperref, UTF8]{ctexart} 2.\numberwithin{equation}{section} %article中让公式按章节名编号 3.\p ...

  10. Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口

    Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口.Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...