快速排序是利用递归来实现的一种排序算法,每执行一次确定一个基准值并返回。
需要传入 指向数组第一个元素 和 最后一个元素的指针作为参数。
分别设为low 和 high。
下面我们模拟一下计算机如何执行:(默认升序)
以
50, 36, 66, 76, 36, 12, 25, 95 为例
当进入函数时选取第一个值为基准值(也就是50)
先和high指向的元素比较(95)
- 50 <= 95 , high向前移。指向 25.
- 50 >= 25,将25填充到50的位置。
- 然后和指向low的值比较,
- 刚刚25已经移到第一个位置(也就是low指向的位置)
- 50 >= 25, low向后移,指向36.
- 50 >= 36,low向后移,指向66.
- 50 <= 66,将66填充到 high指向的位置
- 然后再和high指向的值比较,
- 50 <= 66,high 向前移,指向12
- 50 >= 12, 将12填充到low指向的位置
- 然后和low指向的值比较
- …
- 最后low和high指向同一个位置,这个位置也就是基准值应该在的位置。
总结一下:
1.选取基准值
2.先和high指向元素比较,小于,high–,大于*(a+low) = *(a+high);
3.再和low指向元素比较,大于,low++,小于*(a+high) = *(a+low);
4.最后low和high指向同一个位置, 返回指向这个位置的值。
下面附上简单示例,
#include<iostream>
#include <ctime>
int partion(int low,int high, int *a)
{
int X = *(a + low); //选取基准值
if(a == NULL) return 0;
while(low != high)
{
while(low != high && X <= *(a + high))
{
high--; //先和high指向的值比较
}
*(a+low) = *(a+high);
while(low != high && X >= *(a + low)) //再和low指向的值比较
{
low++;
}
*(a + high) = *(a+low);
}
//退出循环时,low和high相等
*(a + low) = X;
return low; //返回基准值所在位置
}
void qsort(int low, int high, int *a)
{
int temp = partion(low,high,a);
if(low != temp)
{
qsort(low,temp-1,a); //将上面分好的左边一半传入函数
}
if(high != temp)
{
qsort(temp+1, high,a);
}
}
int main()
{
int *a = (int*)malloc(sizeof(int)*100000);
for(int i = 0; i < 100000; i++)
{
a[i] = 100000 - i;
}
clock_t timeStart = clock(); //设置时间初值
qsort(0,99999,a);
cout <<" qsort time : " << clock() - timeStart; //打印出这个排序所需时间
cout << endl;
}