1.排序时,数组含有大量重复元素,应该使用哪种排序手段?

(1)mergeSort:与数组的特征无关,比较次数总是在1/2NlgN~NlgN之间

(2)quickSort:当所有的元素全都相同的时候,使用平方次时间

2.3-way  partitioning算法的目标:

将数组划分为3部分:

(1)lt和gt之间的元素等于v

(2)lt的左边元素小于v

(3)gt的右边元素大于v

3.Dijkstra的3-way partitioning算法:

(1)划分元素v是a[lo]

(2)scan i  from left to right

①a[i]<v:交换a[i]和a[lt],同时增大lt和i

②a[i]>v:交换a[i]和a[gt],减小gt

③a[i]==v:增大i(也就是不移动相等的元素)

i指向未遍历的元素,lt左边是比v小的,gt右边是比v大的,lt与i之间的是等于v的元素。

这个操作保证了等于v的元素 in place,接下来只需要分别对大于v和小于v的两个部分分别排序。

4.如果打乱数组,并且使用3-way partitioning,很多应用运行时间会是线性时间,会比mergesort快很多。

5.算法实现

package com.cx.sort;

public class Quick3way {
public static void sort(Comparable[] a) {
//打乱数组
Shuffling.sort(a);
sort(a,0,a.length-1);
} public static void sort(Comparable[] a,int lo,int hi) {
if(hi<=lo) return;
int lt=lo,gt=hi,i=lo;
Comparable v=a[lo];
//只要i和gt不重叠就要继续进行
//完成后,lt左边小于v,gt右边大于v,lt..gt等于v
while(i<=gt) {
int cmp=a[i].compareTo(v);
//a[i]<v,交换a[lt]和a[i]
if(cmp<0) exch(a, i++, lt++);
//a[i]>v,交换a[i]和a[gt]
else if(cmp>0) exch(a, i, gt--);
//保证等于v的元素in place
else i++;
}
//递归排序lt左侧和gt右侧部分
sort(a, lo, lt-1);
sort(a, gt+1, hi);
} private static boolean less(Comparable v,Comparable w) {
return v.compareTo(w)<0;
} private static void exch(Comparable[] a,int i ,int j ) {
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
private static void show(Comparable[] a) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" "); }
System.out.println();
}
public static void main(String[] args) {
String a[]= {"s","o","r","t","e","x","a","m","p","l","e"};
show(a);
sort(a);
show(a);
}
}

2.5 3-way quickSort的更多相关文章

  1. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  2. Javascript算法系列之快速排序(Quicksort)

    原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...

  3. JavaScript 快速排序(Quicksort)

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  4. QuickSort 快速排序 基于伪代码实现

    本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...

  5. quicksort

    快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...

  6. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  7. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  8. python Quicksort demo

    __author__ = 'student' ''' quicksort step 1, choose one pivot, such as pivot=la[0] step 2, scan the ...

  9. 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]

    [本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...

  10. 这个代码怎么改??Help快速排序 quicksort

    #include<stdio.h>int a[101],n;void quicksort(int left,int right){     int i,j,t,temp;     if(l ...

随机推荐

  1. 219 Contains Duplicate II 存在重复 II

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使 nums [i] = nums [j],并且 i 和 j 的绝对差值最大为 k. 详见:https://leetcod ...

  2. css中display设置为table、table-row、table-cell后的作用及其注意点

    html: <div class="table"> <div class="row"> <div class="cell ...

  3. js基础盲点

    var myarray= new Array(8); //创建数组,存储8个数据. 注意:1.创建的新数组是空数组,没有值,如输出,则显示undefined.2.虽然创建数组时,指定了长度,但实际上数 ...

  4. 批处理 reg add /?

    C:\Users\Administrator>reg add /? REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [ ...

  5. eclipse 升级note

    参考http://www.cnblogs.com/jiqingwu/archive/2013/05/26/eclipse_plugins_import.html. 最终决定采用 启动 eclipse. ...

  6. Method Dispatch in Protocol Extensions

    We learned in the Protocol-Oriented Programming session at WWDC 2015 that Swift uses two different d ...

  7. list.extend的结果是None

    执行list.exend()方法后,会直接修改list本身,而不会产生返回值 In [97]: d=(43,) In [98]: type(d) Out[98]: tuple In [99]: c O ...

  8. python day one

    今日内容: python基础: 一 编程语言 什么是编程语言? 上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人 ...

  9. vue 画二维码

    首先安装一下相关的插件 qrcode2 npm install --save qrcode2 然后在需要画二维码的页面引入一下 import QRCode from 'qrcode2' 最后在meth ...

  10. ionic提供的配色方案

    .light #ffffff .stable #f8f8f8 .positive #387ef5 .calm #11c1f3 .balanced #33cd5f .energized #ffc900 ...