快速排序使用分治法来把一个数组分为两个子数组。具体算法描述如下:
- 从数列中挑出一个元素,称为 “基准”,可以选最左边的数;
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。该基准就处于数组的中间位置。
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
当基准数选择最左边的数字时,那么就应该先从右边开始搜索;当基准数选择最右边的数字时,那么就应该先从左边开始搜索。不论是从小到大排序还是从大到小排序!
具体代码如下:
void quickSort(int* arr,int left,int right)//快速排序,从小到大
{
if(left>right)
{
return ;
}
int i=left;
int j=right;
int base=arr[left];//取最左边的数作为基准数
while(i<j)
{
while (arr[j]>=base && i<j)//左边位边界时,先从右边开始遍历 ,找比base小的数
{
--j;
}
while (arr[i]<=base && i<j)//从左边开始遍历,找比base大的数
{
++i;
}
if(i<j)
{
swapVal(&arr[i], &arr[j]);
}
}
arr[left]=arr[i];// arr[left] 和 arr[i]交换
arr[i]=base;
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
return ;
}