快速排序,简称快排,像什么简单插入,冒泡交换,这种面试基本上都是不会问的,但是快排感觉出现的频率有点高。
分析
首先选择一个基准值,通常为了方便,取第一个元素,然后目的是为了将剩下的元素分成两部分,第一部分都比基准值小,剩下的自然就放在第二部分,然后将基准值放在两部分的中间,分别对左右两部分分别执行上诉操作,直到待排序序列长度为1。快排是不稳定的,假设有两个相等的元素都小于基准值,但是原始序列中较后的那个元素被放到左半部分的时候是放在前面的,这就导致了不稳定性。
复杂度分析
时间复杂度:最好的情况,总共递归log2n次, 每次需要比较n次,所以记为O(nlog2n); 最坏的情况,序列有序,双指针退化为单指针,即一边在移动,导致log2n退化为n,记为O(n2)。
空间复杂度:因为需要递归,所以与排序规模有关系,复杂度记为O(nlog2n)。
代码
void quickSort(int *array, int low, int high)
{
if(low<high)
{
int temp=array[low];
int i=low, j=high;
while(i<j)
{
while(j>i&&array[j]>temp)--j;
if(j>i)
{
array[i]=array[j];
++i;
}
while(i<j&&array[i]<temp)++i;
if(i<j)
{
array[j]=array[i];
--j;
}
}
array[i]=temp;//此时i==j
quickSort(array, low, i-1);
quickSort(array, i+1, high);
}
}