快速排序
一、简述
快速排序的排序思路是:
-
从待排序的集合中,选出一个基准 temp(通常选择第一个元素)
-
每一趟排序,从区间两端交替向中间扫描,每个元素和基准 temp比较,
-
将要排序的数据分割成独立的两部分,
-
其中一部分的所有数据比基准 temp 都来的大
-
另外一部分的所有数据基准 temp 都要小
-
然后再按此方法对这两部分数据分别进行 快速排序
-
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二、举例详解
对序列6,8,7,9,0,1,3,2,4,5
采用快速排序。
三、算法实现
/*
快速排序的排序思路是:
从待排序的集合中,选出一个基准 temp(通常选择第一个元素)
每一趟排序,从区间两端交替向中间扫描,每个元素和基准 temp比较,
将要排序的数据分割成独立的两部分,
其中一部分的所有数据比基准 temp 都来的大
另外一部分的所有数据基准 temp 都要小,
然后再按此方法对这两部分数据分别进行 快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*/
#include <stdio.h>
//对arr[left]到arr[right]的元素进行快速排序
void quick_sort(int *arr, int left, int right)
{
if(left < right)
{
//用区间的第一个元素作为基准 temp
int temp = arr[left];
int low = left, high = right;
//从区间两端交替向中间扫描,直到 low = high 为止
while(low != high)
{
//从右边开始扫描,直到找到小于 temp 的元素
while(arr[high] >= temp && low < high)
high--;
//跳出循环说明temp右边找到一个比temp来得小的数,则把它赋给arr[low]
arr[low] = arr[high];
//从左边开始扫描,直到找到大于 temp 的元素
while(arr[low] <= temp && low < high)
low++;
//跳出循环说明temp左边找到一个比temp来得大的数,则把它赋给arr[high]
arr[high] = arr[low];
}
//跳出循环说明 low = high,相等的位置即temp基准位置
arr[low] = temp;
//对左区间递归排序
quick_sort(arr, left, low - 1);
//对右区间递归排序
quick_sort(arr, low + 1, right);
}
}
int main()
{
int value[] = {8,3,6,2,4,5,7,1,9,0};
printf("排序前的数据为:\n");
for(int i=0; i<10;i++)
printf("%d ",value[i]);
printf("\n\n");
quick_sort(value,0,9);
printf("排序后的结果为:\n");
for(int i=0; i<10;i++)
printf("%d ",value[i]);
printf("\n");
return 0;
}
四、运行结果:
算法分析:
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(nlog2n) | 不稳定 |