【排序算法】快速排序

来源:互联网 发布:手机自动关闭数据连接 编辑:程序博客网 时间:2024/06/11 23:53

1.快速排序的定义

  • 快速排序是冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。

  • 快速排序还采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,

  • 快速排序的基本思想:数组中的每个元素与基准值比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边,直到排序结束。

2.快速排序的流程

  • 找基准值,设Pivot = a[0]

  • 分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。

  • 进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤。

实例:

这里写图片描述

3.快速排序的代码实现

public class QuitSort {    public static void main(String[] args) {        int[] data = {5,9,4,3,7};        sort(data,0,data.length-1);        System.out.println("排序后 "+ Arrays.toString(data));    }    public static void sort (int[] data , int left,int right) {        if (left>right) {            return;        }        //获取下次分割的基准标号        int mid = getMid(data,left,right);        //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序        sort(data,left,mid-1);        //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序        sort(data,mid+1,right);    }    public static int getMid(int[] data,int left,int right){        //以最左边的数为基准        int pivot = data[left];        while (left<right){            //从右端开始,向左遍历,直到找到小于pivot的数            while(left<right && data[right] > pivot){                right--;            }            //将比pivot小的元素放到最左边            data[left] = data[right];            //从左端开始,向右遍历,直到找到大于pivot的数            while(left<right && data[left] < pivot){                left++;            }            //将比pivot大的元素放到最右边            data[right] = data[left];        }        //将pivot放到left的位置,        data[left] = pivot;        return left;    }}

4.算法分析

(1)归并排序算法的性能

这里写图片描述

(2)时间复杂度

  • 当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

  • 而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

  • 所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。

(3)空间复杂度

快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 Nlog2N次 的分割处理,所以占用空间也是 Nlog2N 个。

(4)算法稳定性

在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

(5)基准关键字的选取

基准关键字的选取是决定快速排序算法的关键,常用的基准关键字的选取方式如下:

  • 三者取中
    将序列首、尾和中间位置上的记录进行比较,选择三者中值作为基准关键字。

  • 随机数
    取left和right之间的一个随机数这里写图片描述,用n[m]作为基准关键字。采用这种方法得到的快速排序一般称为随机的快速排序

  • 固定值
    取最左边元素的值

5.快速排序算法的优化

  • 三者取中算法改进

  • 优化小数组时的排序方案

  • 优化递归操作



本人才疏学浅,若有错,请指出
谢谢!

原创粉丝点击