今天接着继续我们的排序算法哪家强系列
今天给大家介绍一种新的排序算法----快速排序算法,听这名字就知道快速排序算法的特点,那就是快. 具体有多快呢,我之前给大家也介绍了几种排序算法,现在,我们将各大排序算法的效率进行一个汇总展示,各种排序算法效率对比一目了然
快速排序的核心思想如下:
首先,从给定的数组中找到一个基准值,然后以基准值为划分标准,将该数组划分为两部分,一部分
大于该基准值,另一部分小于该基准值,然后递归进行划分.直至数组元素有序.
具体详细的解释在代码注释中
代码如下:
#include<stdio.h>
#include<stdlib.h>
// 快速排序算法(递归版本)
void swap(int *x, int *y){
int temp = *x;
*x = *y;
*y = temp;
}
// 划分函数
int partion(int *array, int left, int right){
int begin = left;// 用begin一开始标记数组首位元素
int end = right - 1;// 用end一开始标记数组末尾元素
// 选取数组最后一位元素为划分基准值
int key = array[right - 1];
while (begin < end){
// 让begin 从左往右开始找比基准值大的元素
while (begin < end&&array[begin] <= key){
begin++;
}
// 退出循环的原因有两种情况
// 情况 1: begin已经遍历完了所有的元素
// 情况 2: 在遍历的过程中已经找到了比基准值大的元素
//让end 从右往左开始找比基准值小的元素
while (begin < end&&array[end] >= key){
end--;
}
// 退出循环的原因有两种
// 情况 1:end遇到了begin
// 情况 2:在遍历的过程中已经找到了比基准值小的元素
// 如果begin和end还没有相遇就将两者交换
if (begin != end){
swap(&array[begin], &array[end]);
}
}
// 此时,begin 和end 已经相遇, 此时元素分布情况为 :
// 1 基准值仍在 数组末尾位置
// 2 begin之前的元素小于基准值
// 3 begin之后的元素(包括begig在内) 大于基准值
// 此时需要将基准值元素和begin位置的元素交换
// 由于存在以下两种极端情况 交换前需要先做判断
// 极端情况 1 :一开始该数组元素的最大值就在数组的末尾位置.此时最大值为基准值, begin一直从左往右遍历直到与end 相遇, end不动
// 极端情况 2 :一开始该数组元素的最小值就在数组的末尾位置,此时begin不动,end 一直从右往左遍历,直到与begin相遇
if (begin != right - 1){
swap(&array[begin], &array[right - 1]);
}
// 交换完成后,元素分布情况为: 比基准值小的元素 基准值 比基准值大的元素
// 交换完成后,将基准值返回
return begin;
}
// [left,right)
// 输入: 一个数组 数组的做左右边界
void quicksort(int *array, int left, int right){
// 确保有元素的情况下再来进行排序
if ((right - left) > 1){
// 通过partion函数将数组划分为两部分,然后将划分基准值返回
int div = partion(array, left,right);
// 递归进行
quicksort(array, left, div);
quicksort(array,div + 1, right);
}
}
// 打印函数
void print(int *array, int size){
for (int i = 0; i < size; ++i){
printf("%d ", array[i]);
}
printf("\n");
}
int main(){
int array[] = { 1, 3, 0, 7, 9, 2, 4, 6, 8, 5 };
int size = sizeof(array) / sizeof(array[0]);
quicksort(array, 0, size);
print(array, size);
system("pause");
return 0;
}
输出结果