快排

快排

2020-06-21
数据结构

思想 #

大停,小停,大小交换,相遇时相遇点和基准点交换,以相遇点为界限展开递归

1、选取一个基准元素(star)

2、比star小的放到star左边,比star大的放到star右边

3、当上述步骤执行完成后,star的位置就不变了,它现在的位置就是它最终该放置的位置

4、对star左边所有元素进行1、2操作,对star右边元素进行1、2操作

代码实现 #

#include "sort.h"

static void swap(int *, int, int);
static void sort1(int *, int, int);

void sort(int *arr, int len)
{
    sort1(arr,0, len - 1);
}

/*
大停,小停,大小交换,相遇时相遇点和基准点交换,以相遇点为界限展开递归
*/
static void sort1(int *arr, int start, int end)
{
    if (start >= end)
    {
        return;
    }
    int star = arr[start];
    int l = start, r = end;
    while (l < r)
    {
        while ((arr[r] > star) && (l < r))
        {
            r--;
        }
        while ((arr[l] <= star) && (l < r))
        {
            l++;
        }
        if (l < r) 
        {
            swap(arr, l, r);
        }
        else 
        {
            swap(arr, start, l);
        }
    }
    sort1(arr, start, l -1);
    sort1(arr, l + 1, end);
}

static void swap(int *arr, int num1, int num2)
{
    int temp = arr[num1];
    arr[num1] = arr[num2];
    arr[num2] = temp;
}

复杂度 #

平均时间复杂度:O(nlog₂n)

空间复杂度:O(log₂n)

不稳定的排序算法