算法导论基础知识--快速排序

本文章主要记录了快速排序算法,在算法实现的时候固定选择数组最后一个元素值作为主元,对数组进行划分!当然了主元素的选取是可以随机来选择的,在以后的的文章中会有提到。--注:本文内容主要参考《算法导论》

算发的性能分析

缺点:最坏情况下运行时间是   Θ(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代码实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值