快速排序(Quick Sort)

1、快速排序的核心是分治思想:

        分治思想(Divide and Conquer)是一种通过分解问题、解决子问题、合并结果来解决复杂问题的策略。其核心可概括为:

  • 分解:将大规模问题拆分为多个相互独立且形式相同的子问题(如将蛋糕切成小块);
  • 解决:递归或直接处理子问题(当子问题足够简单时直接求解);
  • 合并:将子问题的解整合为原问题的解(如拼合小蛋糕块还原整体)。

        假设我们的目标依然是按从小到大的顺序排列,我们找到数组中的一个分割值,把比分割值小的数都放在数组的左边,把比分割值大的数都放在数组的右边,这样分割值的位置就被确定数组一分为二,我们只需排前一半数组和后一半数组,复杂度直接减半。采用这种思想不断地进行递归,最终分割得只剩一个元素时,整个序列自然就是有序的。

2、代码实战步骤:

 首先我们通过随机数生成10个元素,通过随机数生成,我们可以多次测试排序算法是否正确,然后打印随机生成后的元素顺序,然后通过快速排序对元素进行排序,然后再次打印排序后的元素顺序。

3、假如每次快速排序数组都被平均地一分为二:

那么可以得出 QuickSont递归的次数是 log2n,第一次 partition遍历次数为n,分成两个数组后,每个数组遍历n/2次,加起来还是n,因此时间复杂度是 (nog2n),因为计算机是二进制的,所以在复试面试回答复杂度或与人交流时,提到复杂度时一般直接讲 O(nlogn),而不带下标。

4、快速排序最差的时间复杂度为什么是n2呢?

因为数组本身从小到大有序时,如果每次我们仍然用最左边的数作为分割值,那么每次数组都不会二分,导致递归n次,所以快速排序最坏时间复杂度为n的平方,当然,为了避免这种情况有时会首先随机选择一个下标,先将对应下标的值与最左边的元素交换,再进行partition 操作从而极大地降低出现最坏时间复杂度的概率,但是仍然不能完全避免因此快排最好和平均时间复杂度是 O(nlog2n),最差是 O(n2)。

5、快排的空间复杂度是 O(log2n),因为递归的次数是log2n,而每次递归的形参都是需要占用空间的。

#include 
#include 
#include 

typedef int ElemType;
typedef struct{
    ElemType *elem;//存储元素的起始地址
    int TableLen;//元素个数
}SSTable;

void ST_Init(SSTable &ST, int len)
{
    ST.TableLen = len;
    ST.elem = (ElemType *) malloc(sizeof(ElemType)*ST.TableLen);//申请一块堆空间,当数组来使用int i;
    int i;
    srand(time(NULL));//随机数生成,每一次执行代码就会得到随机的 10个元素
    for(i=0;i=pivot)//从后往前遍历,找到一个比分隔值小的元素
        {
            high--;
        }
        A[low]=A[high];//把比分隔值小的那个元素放到A[low]中
        while(low

你可能感兴趣的:(算法,排序算法,数据结构)