快速排序

1、思想

快速排序是分治思想。

2、步骤

1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。

3、代码

void quickSort(int left, int right)
{
    int value = a[left];
    int i = left;
    int j = right;

    if (left > right)
    {
        return;
    }
    //在这里,i<j是一个很重要的条件,自己写的时候忘记了
    while (i<j)
    {
        while (a[j] >= value && i < j)
        {
            j--;
        }
        while (a[i] <= value && i < j)
        {
            i++;
        }

        if (i < j)
        {
            int t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }
    a[left] = a[i];
    a[i] = value;

    quickSort(left, i - 1);
    quickSort(i + 1, right);

}

4、分析

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
1.当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度为 O(n2)
  

T(n)=cn+T(n1)=cn+c(n1)+T(n2)=2cnc+T(n2)        =c[n(n+1)/21]+T(1)=O(n2)

2.当分区选取的基准元素为待排序元素中的”中值”,为最好的情况,时间复杂度为O(nlog2n)。

 

T(n)<=cn+2T(n/2)<=cn+2(cn/2+2T(n/4))=2cn+4T(n/4)<=2cn+4(cn/4+2T(n/8))=3cn+8T(n/8)<=cnlogn+nT(1)=O(nlogn) 其中cn 是一次划分所用的时间,c是一个常数

3.快速排序的空间复杂度为O(log2n).

点赞