本文章主要记录了快速排序算法,在算法实现的时候固定选择数组最后一个元素值作为主元,对数组进行划分!当然了主元素的选取是可以随机来选择的,在以后的的文章中会有提到。--注:本文内容主要参考《算法导论》
算发的性能分析
缺点:最坏情况下运行时间是 Θ(n*n);
优点:但是他的 期望运行时间Θ(nLGn),就地排序,在虚拟环境中可以很好工作
实现思路:
快速排序是基于分治模式的,下面是对数组A[p..r]排序的分治过程的三个步骤:
分解:将A[p..r]划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素小于等于A[p],而A[q+1..r]中的每个元素都大于A[p],下标q也在这个 划分过程中进行计算。
解决:通过地柜调用快速排序,对A[p..q-1]和A[q+1..r]进行排序。
合并:因为两个子数组是就地排序,所以对他们的合并不需要操作,整个数组已经排好序。
下面的程序实现快速排序:
quickSort(int[] A, int p, int r) {
int q;
if(p < r) {
q = partition(A, p, r);//数组划分函数,这个是快速排序的关键部分
quickSort(A, p, q-1);//通过递归调用快速排序,对子数组A[p..q-1]排序
quickSort(A, q+1, r);
}
}
为了对完整的数组进行排序,最初调用quickSort(A, 1, length[A])
数组划分:
int partition(int[] A, int p, int r) {
int x = A[r];//选取A[r]为主元
int i = p - 1;//左边字部分的最右边下标index
int temp; //用于交换元素时用
for(int j=p; j<=r-1; j++) {
//如果当前元素小于住元素的值,将当前元素放到小于主元素值的左半部分的最右边
if(A[j] <= x) {
i++;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
//将主元素值放到中间合适的位置
temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;//返回划分好index
}
计算过程如下图所示:
计算过程可以分为四个部分,在每一轮迭代是,对于任何数值K
如果有p<=k<=i,则A[k]<A[r]
如果有i+1<=k<=j,则A[k]>A[r]
如果有k=r,则A[k]=A[r]
完整的实现代码如下
package chapter01;
/**
* 当函数的参数是数组时,相当于指针传递,故在子函数中对数组的改变会影响到原来数组的值,因此我们在调用快速排序值的时候,不必该函数返回数组参数
* 类功能说明:快速排序算法
* <p>Title: QuiteSort.java</p>
* @author
* @date 2014-11-29 上午10:38:06
* @version V1.0
*/
public class QuiteSort01 {
public static void main(String[] args) {
int A[] = {0, 2, 8, 7, 1, 3, 5, 6, 4};//A[0]属于占位符,暂时无实际意义
int result[] = new int[A.length];
quickSort(A, 1, A.length-1);//开始快速排序
for(int i=1; i<A.length; i++) {
System.out.println(A[i]);
}
}
/*
* 快速排序函数,
* */
private static void quickSort(int[] A, int p, int r) {
// TODO Auto-generated method stub
int q;
if(p < r) {
q = partition(A, p, r);//数组划分函数,这个是快速排序的关键部分
quickSort(A, p, q-1);//通过递归调用快速排序,对子数组A[p..q-1]排序
quickSort(A, q+1, r);
}
}
/*
* 实现快速排序算法的关键过程,他对子数组A【p..r】进行就地重拍,在划分的同时,就已经将两部分大小重排了
* */
private static int partition(int[] A, int p, int r) {
int x = A[r];//选取A[r]为主元
int i = p - 1;//左边字部分的最右边下标index
int temp; //用于交换元素时用
for(int j=p; j<=r-1; j++) {
//如果当前元素小于住元素的值,将当前元素放到小于主元素值的左半部分的最右边
if(A[j] <= x) {
i++;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
//将主元素值放到中间合适的位置
temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;//返回划分好index
}
}
以上就是快速排序的Java代码实现