快速排序:
设定一个枢纽的值,一般以首个元素的值为枢纽的值,把比枢纽小的元元素放在左边,比枢纽值大的元素放在右边,最后把枢纽的值放到合适的位置。根据返回枢纽的位置,对以上过程进行递归。
改进型:随机枢纽快速排序RadomQuickSort.java
设定一个枢纽的值,一般以首个元素的值为枢纽的值,把比枢纽小的元元素放在左边,比枢纽值大的元素放在右边,最后把枢纽的值放到合适的位置。根据返回枢纽的位置,对以上过程进行递归。
/**
* EnhancedQuickSort.java
*
* 快速排序
*
* @author Administrator
*/
public class QuickSort {
public static void quickSort(int[] a) {
qSort(a, 0, a.length - 1);
}
/**
* 对下标从s到t的元素进行快速排序。
*/
public static void qSort(int[] a, int s, int t) {
if (s < t) {
int pivot = partition(a, s, t);
qSort(a, s, pivot - 1);
qSort(a, pivot + 1, t);
}
}
/**
* 该方法返回枢纽的下标。
*/
public static int partition(int[] a, int p, int r) {
int i = p, j = r + 1;
int x = a[p];
/**
* 将 >= x的元素交换到右边区域,<= x的元素交换到左边区域。
*/
while (true) {
while (a[++i] < x) {
if (i >= r)
break;
}
while (a[--j] > x)
;
if (i >= j)
break;
Util.swap(a, i, j);
}
a[p] = a[j];
a[j] = x;
return j;
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("请输入数字以空格隔开");
System.exit(-1);
}
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
a[i] = Integer.parseInt(args[i]);
// int[] a = new int[100];
// for(int i = 0; i < a.length; i++)a[i] = 100-i;
quickSort(a);
// 输出排序后的数组元素。
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
改进型:随机枢纽快速排序RadomQuickSort.java
/**
* RadomQuickSort.java
*
* 随机枢纽快速排序.每次都随机选择无序序列中的一个数为枢纽的值.
*
* @author Administrator
*
*/
public class RadomQuickSort {
public static int radomPartition(int[] a, int p, int r) {
// 生成p到r之间的一个随机数j
int j = (int) Math.round(Math.random() * (r - p)) + p;
Util.swap(a, p, j);
return QuickSort.partition(a, p, r);
}
public static void rQSort(int[] a, int s, int t) {
if (s < t) {
int pivot = radomPartition(a, s, t);
rQSort(a, s, pivot - 1);
rQSort(a, pivot + 1, t);
}
}
public static void radomQuickSort(int[] a) {
rQSort(a, 0, a.length - 1);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("请输入数字以空格隔开");
System.exit(-1);
}
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
a[i] = Integer.parseInt(args[i]);
radomQuickSort(a);
// 输出排序后的数组元素。
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}