1. 在无序的数组中,先找一个数字(一般找数组的第0个元素)作为基准值key
2. 将比基准值小的放在它的左边,比基准值大的放在它的右边(这样key左边的都比它小,右边的都比它大)
3. 对key左边的数据使用同样的方法进行排序,对key右边的数据也使用同样的方法进行排序,什么叫用同样的方法:递归
问题:如何将比key小的放到左边,比key大的放在右边?
1. 将数组的第0个元素赋值给key(挖坑)
2. 从右边往左边找比key小的填前面的坑(将前面的坑赋值为找到的值),此时后面又挖了一个坑。
3. 从左边往右边找比key大的填后面的坑,此时前面又挖了一个坑
4. 循环2~3步
5. 最后一个坑用key填
/*
@brief: 快速排序函数
@param: int *a接收数组地址
@param: int left数组左边的下标
@param: int right数组右边一个下标
@return 无返回值
*/
void quick_sort(int *a, int left, int right)
{
int n = left;
int m = right;
int key = a[n];
if(n >= m)
return;
while(n < m)
{
//从右边往左边找比key小的值
while(n < m && a[m] >= key)
m--;
//如果找到了要填前面的坑
if(n < m)
a[n] = a[m];
else
break;
//从左边往右边找比key大的值
while(n < m && a[n] <= key)
n++;
//如果找到了要填后面的坑
if(n < m)
a[m] = a[n];
else
break;
}
//最后一个坑
a[n] = key; //a[m] = key;也可以因为最后一个坑的时候m == n
//对key左边的部分排序
quick_sort(a, left, n-1);
//对key右边的部分排序
quick_sort(a, n+1, right);
}
int main(void)
{
int a[] = {9, 6, 2, 4, 6, 4, 0, 6, 2, 0};
int n = 0;
int m = sizeof(a)/sizeof(a[0]) - 1; //m = 10 - 1;
quick_sort(a, n, m);
int i;
for(i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}