排序算法——快速排序

  快速排序同样是一种交换排序,在以往的互联网求职面试过程中,经常有面试官让手写快排的算法,这属于最基本的知识,我们一定要烂熟于心。

  首先来了解一下快排是怎么一回事:假设给定了一个序列,将序列的第一个元素(或者任意元素都行)作为基准,首先从后向前扫描序列,遇到比基

准小的元素,将其交换到基准的前面;然后从前向后扫描序列,遇到比基准大的元素,将其交换到基准的后面。这样一趟排序完成后,基准的左侧都是

比其小的元素,基准右侧都是比其大的元素,也就是说这个基准将给定的序列分为了两子序列。注意,这只是一趟排序的结果,我们再对子序列运用同

样的操作,因此,可以采用递归的方式。

  算法实现如下:

#include <stdlib.h>
#include <stdio.h>

void QuickSort(int A[], int s, int t)
{
    int i, j, temp;
    i = s;
    j = t;
    if(s == t)                  // 递归结束的条件
        return;
    else
    {
        temp = A[s];            // 选定的基准
        while(i!=j)
        {
            while(i < j && A[j] > temp)     // 从后向前扫描
                j--;
            A[i] = A[j];                    
            while(i < j && A[i] < temp)
                i++;
            A[j] = A[i];
        }
        A[i] = temp;            // 当i=j时循环结束,此时i为基准应该插入的位置
        QuickSort(A, s, i-1);   // 递归处理基准左侧的子序列
        QuickSort(A, i+1, t);   // 递归处理基准右侧的子序列
    }
}

  最坏情况下,快排的时间复杂度为O(n2),空间复杂度为O(log2n)。这里需要注意的就是快排的空间复杂度,已经不是一个常量级的了,至于如何推

导,请查阅相关的资料。最后,对于算法的稳定性而言,快排是不稳定的。

  这里的稳定性是指:如果给定的序列中有某两个元素相等,那么在排序前后,这两个元素的位置是否变化,如果未变化,则说明该排序算法是稳定的,

否则,是不稳定的。

原文地址:https://www.cnblogs.com/greedyco/p/7148355.html