算法思想:快排是采用的分治思想。一般取第一个元素为基准,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准要小,另一部分数据都比基准要大,然后用同样的方法对着两部分数据分别进行快排,快排使用递归思想,直至整个数列变为有序数列。
时间复杂度:n*logn(平均时间复杂度)
空间复杂度:O(1)
是否是稳定排序:不是稳定排序
代码示例:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int GetPartition(int a[], int low, int high)
{
int ret = -1;
ret = (a != NULL)&&(low >= 0)&&(high > 0)&&(low < high);
//以Temp为基准,比Temp大的放Temp右边,比Temp小的放Temp放左边
int Temp = a[low];
if(ret)
{
while(low < high)
{ //从右向左找一个比Temp小的值 填到空出来的a[low]处
while( (low < high)&&(a[high] >= Temp) )
{
high--;
}
if(low < high)
{
a[low] = a[high];//找到一个比Temp小的,放到空出来的a[low]位置
low++;
}
//从左向右找一个比temp大的值 填到空出来的a[high] 里面去
while( (low < high)&&(a[low] < Temp) )
{
low++;
}
if(low < high)
{
a[high] = a[low];//找到一个比Temp大的,放到上面刚空出来的a[high]位置
high--;
}
}
}
//将Temp放入恰当的位置
a[low] = Temp;
//当low = high时第一趟排序结束,Temp左边都是比Temp大的,Temp右边都是比Temp小的
ret = low;
return ret; //返回middle值
}
int QuickSort1(int a[], int low, int high)
{
int ret = -1;
int middle = 0;
ret = (a != NULL)&&(low >= 0)&&(high >= 0)&&(low < high);
if(ret)
{
middle = GetPartition(a, low, high);
QuickSort1(a,low,middle-1);
QuickSort1(a,middle+1,high);
}
return ret;
}
int PlayFunc(int *a, int n)
{
int i = 0;
int ret = -1;
ret = (a != NULL)&&(n > 0);
if(ret)
{
printf("Array[]:");
for(i = 0; i < n; i++)
printf("%d, ", a[i]);
printf("\n");
}
return ret;
}
void main()
{
int array[SIZE] = {8,5,10,7,6,9,4,3,2,1};
PlayFunc(array, 10);
QuickSort1(array, 0,9);
PlayFunc(array, 10);
}
运行效果截图:
这里贴出一篇博文链接,也是写快速排序的,分析的相当到位:点击打开链接
我自己也是看了这篇文章然后自己撸出来的代码,代码都差不多,但是觉得他分析快速排序的思路很好,根据思路再写出代码就很容易了。
同样,快速排序一样可以优化,待续...