/************************************
*函数名:quicksort
*作用:快速排序算法
*参数:
*返回值:无
************************************/
void quicksort(int array[], int maxlen, int begin, int end)
{
if(begin == end)
{
printf("end\n");
return;
}
int i, j;
i = begin; // 将array[begin]作为基准数,因此从array[begin+1]开始与基准数比较!
j = end; // array[end]是数组的最后一位的后一位
while(1)
{
while(i<j&&array[++i]<array[begin]);
while(j>i&&array[--j]>array[begin]);
if(i == j)
{
swap(&array[begin],&array[j-1]);
break;
}
if(i<j)
{
swap(&array[i],&array[j]);
}
}
quicksort(array, maxlen, begin, j-1);
quicksort(array, maxlen, j, end);
}
// 主函数
int main()
{
int n;
int array[BUF_SIZE] = {12,85,25,16,34,23,49,95,17,61};
int maxlen = BUF_SIZE;
printf("排序前的数组\n");
display(array, maxlen);
quicksort(array, maxlen, 0, maxlen); // 快速排序 ,注意maxlen指向数组最后元素的后一个
printf("排序后的数组\n");
display(array, maxlen);
return 0;
}
快速排序的任务是找到key的位置(key为每一段的第一个元素)。
这里采用定义i=begin,j=end(end是数组最后元素的下一个) ,
i从begin一直向end推进,直道遇到比key大的值,
(i循环开始时i至少是begin+1了)
j从end一直向begin推进,直到遇到比key小的值,
i=j时 ,此时i-1即为key要排的位置,将key与a[i-1]交换,然后这一层的排序就完成了。
i<j时,i与j都被卡在了错排的点上,将i与j交换即可。
本层排序结束后按key的位置分两段进行下一层排序
验证:
若元素全大于key,则到最后i=j=begin+1 ;
交换key与a[begin],相当于没动,
数组分为[begin,begin]和[begin+1,end]两段。
若元素全小于key,则到最后i=j=end;
交换key与a[end-1],最大的key到了数组最后
(a[end-1]就是最后一个元素,a[end]是最后的下一个),
数组被分为[begin,end-1]和[end,end]两段。
介于这两种情况之间更不会有问题了。
还有就是根据快速排序的原理,是否有相等的元素不会影响排序,不必特意考虑这种情况。