基本思想:
1.先选取一个基准值(一般选取数组第一个元素)。
2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准值,这个值的位置将在基准值的右边。
3.如果该值小于基准值,那么这个值放在基准值的左侧。
4.然后经过第一个元素作为基准值的排序,会有两个左右子序列,再分别对这两序列进行上述1,2,3的步骤!
附上运行原理框图:
思路取自于:快速排序算法_哔哩哔哩_bilibili
下面来进行代码的实现:
//该函数是快排的最重要的思想 一般面试的时候 写出这个就够了
int Partition(int* arr, int left, int right) //划分函数,int返回的是基准值的下标
{
int tmp = arr[left]; //将基准值提出来到tmp中
while (left < right) //这块的left < right就是判断序列中最少有两个值 值得进行排序
{
while (left<right && arr[right] > tmp) //这块的left < right就是在left和right下标移动的时候 left = right的时候 退出while循环
{
right--; //右边值大于基准值 right下标-- right指向的值不变
}
if (left == right) //left和rigth下标相等的时候 直接退出循环
{
break;
}
arr[left] = arr[right]; //这块的代码的意思就是真的找到了一个right指向的值比基准值tmp小 这时将ar[rigth]赋值给arr[left]
while (left<right && arr[left] <= tmp) //这块给了 "<=" 上面那个while循环给了 ">"
{ //这样就是为了防止数组arr中有重复值 其实上面给 >= 下面给 < 都可以 就是为了把重复值放到同一边这样一个作用
left++; //左边值小于基准值 left下标++ left指向的值不变
}
if (left == right)
{
break;
}
arr[right] = arr[left];
}
arr[left] = tmp; //这块left于right指向同一个下标
return left;
}
void Quick(int* arr, int left, int right) //上图中的左下标和右下标
{
if (left < right)
{
int index = Partition(arr, left, right);
if (left < index - 1) //代表基准值左边子序列中最少有两个值(因为最少要有两个值才有排序的必要)
{
Quick(arr, left, index - 1);
}
if (index + 1 < right)
{
Quick(arr, index + 1, right); //代表基准值右边子序列中最少有两个值
}
}
}
void QuickSort(int* arr, int len)
{
Quick(arr, 0, len - 1);
}
下面附上主函数以及运行结果:
int main()
{
int arr[] = {12,35,11,78,94,132,45,68,99};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr, len);
show(arr, len);
return 0;
}