快排
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)
不稳定的排序算法