1、什么是快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
2、快速排序基本思维
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.重复回调函数本身,直到需要排序的区间大小为1时排序结束。
3、快速排序的基本流程
循环进行以上步骤,直到left和right相等为止。
我们完成一次排序之后,会得到以下的结果
如此,如果要实现98前面部分的排序和后面部分的排序,我们就只需要循环调用本函数,直到最后排序长度为1为止。
4、代码示例
#include <stdio.h>
//计算数组元素个数
int Cal_Len(int *arr)
{
int len = 0;
while(*arr != -1){
len++;
arr++;
}
return len;
}
//快速排序
void QKSORT(int *arr, int len)
{
if(len < 2){
return;
}
int store = *arr;
int left = 0;//左边
int right = len-1;//右边
int i = 0;
while(left != right){
while(*(arr + right) > store){
right--;
}
while(*(arr + left) < store){
left++;
}
int tmp = *(arr + right);
*(arr + right) = *(arr + left);
*(arr + left) = tmp;
}
QKSORT(arr, left);
QKSORT(arr+right+1, len - right - 1);
}
int main()
{
int arr[100] = {98, 999, 68, 99, 360, 58, 198, 48, 468, 21, 78, 668, -1};
int len = 0;
len = Cal_Len(arr);
for(int i = 0; i < len; i++){
printf("%d ", arr[i]);
}
printf("\n");
printf("len = %d\n", len);
QKSORT(arr, len);
for(int i = 0; i < len; i++){
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
5、结果分析
我们初始化的数组中使用了-1来标识该位置是否为空,如果检测为-1,则长度计算停止,返回数组长度,将长度传进快速排序的函数内部执行时,需要注意,每次回调函数的长度都需要进行原有长度的计算,一定不要将变量换成具体的数值。
好的,以上就是今天的内容了!!!
欢迎大家参考指正!!!