2021春招时间到了,面试也越来越多,手撕快排也是腾讯、阿里、字节等大厂所必备的知识,在面试过程中,能够正确讲出快排原理与使用代码实现快速排序也是面试的重点复习之一,话不多说,直接进入今日主题:快速排序
不介绍快速排序了,直插重点
在代码实现这块,建议读者先将快速排序(不断的挖坑)和递归实现先分开代码实现先,再通过理解代码,将这两块进行合起来,完成最终的快速排序算法实现。
代码如下(示例):
#include
#include
/*
快速排序
选第一个为基准数,不断挖坑,
1.从后往前对比,第一个比基准数小的移到low位置
2.从前往后对比,第一个比基准数大的移到上面那个的位置
3.重复2、3操作,直至low==high或low>high
4.再对其它区间进行同样操作
*/
/* 获取基准数在数组排序中处于的位置 */
int getStandard(int arr[], int i,int j)
{
//获取基准数,挖坑
int cur = arr[i];
while(i < j)
{
//注意边界判定
while(i < j && arr[j] >= cur)
j--;
if(arr[j] < cur){
arr[i] = arr[j];
}
while(i < j && arr[i] < cur)
i++;
if(arr[i] > cur){
arr[j] = arr[i];
}
}
//基准数归位
arr[i]=cur;
//返回基准数目前位置,将其左右再进行快速排序
return i;
}
void quicksort(int arr[], int low, int high)
{
if( low < high )
{
int standard = getStandard(arr, low, high);
//对左右剩余的两个区间进行相同操作
quicksort(arr, low, standard-1);
quicksort(arr, standard+1, high);
}
}
int main()
{
int arr[] = {123,12348,12,45,61,5,49,152,465,16,5489,4,153,12,464,654,8};
int length = sizeof(arr)/sizeof(int);
quicksort(arr, 0, length-1);
for(int i=0;i<length-1;i++){
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
代码如下(示例):
#include
#include
/*
快速排序
选第一个为基准数,不断挖坑,
1.从后往前对比,第一个比基准数小的移到low位置
2.从前往后对比,第一个比基准数大的移到上面那个的位置
3.重复2、3操作,直至low==high或low>high
4.再对其它区间进行同样操作
*/
void quicksort(int arr[], int i, int j)
{
//边界判定
if( i >= j )return;
//挖坑(获取基准数),第一个放入的位置。如果在第一个数挖坑,就要从后面开始补坑
int key = arr[i];
int left = i, right = j;
while(i < j)
{
//注意边界判定,不要越界访问
while(i < j && arr[j] >= key)
j--;
if(arr[j] < key)
arr[i] = arr[j];
while(i < j && arr[i] < key)
i++;
if(arr[i] > key)
arr[j] = arr[i];
}
//记得放回key
arr[i] = key;
//对基准数左右两个区间再各自再进行快速排序
quicksort(arr, i+1, right);
quicksort(arr, left, i-1);
return;
}
int main()
{
int arr[] = {123,12348,12,45,61,5,49,152,465,16,5489,4,153,12,464,654,8};
int length = sizeof(arr)/sizeof(int);
//进行快速排序
quicksort(arr, 0, length-1);
//输出排序结果
for(int i=0;i<length-1;i++){
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}