您的位置:首页 > 编程语言

【编程素质】算法-快速排序

2017-04-27 16:45 204 查看

1,基本思想

1)整体思想

①先从数列中取出一个数作为基准数。

②分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

③再对左右区间重复第二步,直到各区间只有一个数。



2)一次划分

①设置2个变量i=0、j=N-1;

②第一个数为基准key;

③j向前搜索,j–,找到第一个比key小的数A[j],将A[i]与A[j]交换;

④i向后搜索,i++,找到第一个比key大的数A[i],将A[i]与A[j]交换;

⑤重复第三、四步,直到i>=j。



2,复杂度分析

快速排序的运行时间和划分是否对称有关。

1)最坏情况

划分的2个区域包含n-1个和1个元素。

T(n) = T(n-1) + O(n) = O(n^2)

2)最好情况

划分对称,2个区域都为n/2个元素。

T(n) = 2T(n/2) + O(n) = O(nlogn)

3,demo

package QuickSort;
/**
* 快速排序(从大到小)
* @author luo
* 分析:
* 1,分解:以a[p]为基准将啊[p:r]划分为3段:a[p:q-1](小于基准元素),a[q](等于基准元素即就是a[p]),a[q+1:r](大于基准)
* 2,递归求解
* 3,合并
*/
public class QuickSort {

/**
* 递归算法
* @param a
* @param p 起始下标
* @param r 结束下标
*/
public static void QuickSort1(int[] a,int p,int r){

if (p < r){
int q = Partition(a,p,r);
QuickSort1(a,p,q-1);
QuickSort1(a,q+1,r);
}
}
/**
* 划分元素
* a[p]为基准元素
* @param a
* @param p 划分起始下标
* @param r 划分结束下标
* @return
*/
public static int Partition(int a[],int p,int r){

int temp=0;//存储交换
int i=p,j=r+1;
/**基准*/
int x=a[p];

while(true)
{
while(a[++i]>x && i<r);//找出比x大的数
while(a[--j]<x);//找出比x小的数
if(i >= j)
{
break;
}
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[p]=a[j];
a[j]=x;
return j;
}
}


package QuickSort;

public class Main{

public static void main(String[] args){
int[] a= {2,3,8,9,1};
QuickSort.QuickSort1(a, 0, 4);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: