Quik.java
package com.math.algorithms;
//快速排序
@SuppressWarnings("rawtypes")
public class Quik {
static Example exa = new Example();
public static void sort(Comparable[] a)
{
//StdRandom.shuffle(a); //消除对输入的依赖
sort(a,0,a.length-1);
}
private static void sort(Comparable[] a,int lo,int hi){
if(hi<=lo) return ;
int j =partition(a,lo,hi);
sort(a,lo,j-1);
sort(a,j+1,hi);
}
//快速排序的切分
@SuppressWarnings("static-access")
private static int partition(Comparable[] a,int lo,int hi){
//将数组切分为a[lo..i-1],a[i],a[i+1..hi] 取a[i]为切割点
int i = lo,j=hi+1;
Comparable v = a[lo];
while(true){
while(exa.less(a[++i],v)) if(i==hi) break;
while(exa.less(v,a[--j])) if(j==lo) break;
if(i>=j) break;
exa.exch(a,i,j);
}
exa.exch(a, lo, j);
return j;
}
}
Example.java //排序算法类的模板方法及main函数
package com.math.algorithms;
import java.util.Random;
//排序算法类的模板
@SuppressWarnings("rawtypes")
public class Example {
public static void sort(Comparable[] a)
{//将a[]按升序排列
int N =a.length;
for (int i = 0; i < N; i++) {
//将a[i]和a[i+1...N]中最小的元素交换
int min = i;
for (int j = i+1; j < N; j++) {
if(less(a[j],a[min])) min =j;
exch(a,i,min);
}
}
}
//v、w比较:v<w、v=w、v>w 分别对应compareTo函数返回值-1、0、1
@SuppressWarnings("unchecked")
public static boolean less(Comparable v, Comparable w){
return v.compareTo(w)<0;//返回true表示v<w
}
//将数组a[]中下标为i和j的俩元素交换位置
public static void exch(Comparable[] a,int i,int j){
Comparable t =a[i];a[i]=a[j];a[j]=t;
}
public static void show(Comparable[] a){
//在单行中打印数组a
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]+" ");
//System.out.println();
}
}
public static boolean isSorted(Comparable[] a){
for (int i = 1; i < a.length; i++)
if(less(a[i],a[i-1])){
return false;
}
return true;
}
public static void main(String[] args) {
Integer[] a = new Integer[8];
Random rand = new Random();
//生成一个随机数组成的数组
for (int i = 0; i < a.length; i++) {
a[i]=rand.nextInt(20);
}
//将数组a排序并输出
// sort(a);
//排序前
System.out.println( isSorted(a));
//
Quik quik = new Quik();
quik.sort(a);
show(a);
//排序后
System.out.println( isSorted(a));
}
}