冒泡排序解决了桶排序浪费空间的问题,但算法效率却浪费了很多。有没有效率又高,又不浪费空间的算法呢?答案就是“快速排序”。
简单说,快速排序就是使用“二分法”,以待排序数组第一个数为基准数,安排两个“哨兵”,左哨兵从左到右寻找第一个大于基准数的数,右哨兵从右到左寻找第一个小于基准数的数,找到则交换。当两个哨兵相遇时,再对相遇点两边的两个数组进行递归排序。
#include<stdio.h>
#include <string.h>
#include <memory.h>
int iScore[] = { 6,5,1,9,8,2,7,3,4 };
void swap(int i, int j)
{
int iTemp = iScore[i];
iScore[i] = iScore[j];
iScore[j] = iTemp;
}
/*
功能:快速排序
参数:iStart,待排序数组的起始位置,从0开始
iEnd,待排序数组的结束位置,如果有n个数,则这个值为n-1
*/
void quicksort(int iStart, int iEnd)
{
if (iEnd - iStart < 2)
{
return;
}
int iBase = iScore[iStart];//基准数
//左哨兵
int i = iStart + 1;
//右哨兵
int j = iEnd;
//左哨兵找到比基准数大的数
bool bFindLeft = false;
//右哨兵找到比基准数小的数
bool bFindRight = false;
while (i < j)
{
if (!bFindRight)
{
if (iBase > iScore[j])
{
bFindRight = true;
continue;
}
j--;
continue;
}
if (!bFindLeft)
{
if (iBase < iScore[i])
{
bFindLeft = true;
continue;
}
i++;
continue;
}
swap(i, j);
j--;//只是右哨兵减1,左哨兵不加,避免错过
bFindLeft = false;
bFindRight = false;
}
if (iBase > iScore[i])
{
swap(iStart, i);
}
quicksort(iStart, i - 1);
quicksort(i + 1, iEnd);
}
int main()
{
//待排序数个数
int iCnt = sizeof(iScore) / sizeof(iScore[0]);
//快速排序,从小到大
quicksort(0, iCnt - 1);
for (int k=0; k<iCnt; k++)
{
printf("%d ", iScore[k]);
}
}
时间复杂度:快速排序的时间复杂度最差和冒泡是一样的,平均时间复杂度为O(NlogN)。