排序算法哪家强之快速排序(递归版本)

今天接着继续我们的排序算法哪家强系列
今天给大家介绍一种新的排序算法----快速排序算法,听这名字就知道快速排序算法的特点,那就是快. 具体有多快呢,我之前给大家也介绍了几种排序算法,现在,我们将各大排序算法的效率进行一个汇总展示,各种排序算法效率对比一目了然
在这里插入图片描述
快速排序的核心思想如下:
首先,从给定的数组中找到一个基准值,然后以基准值为划分标准,将该数组划分为两部分,一部分
大于该基准值,另一部分小于该基准值,然后递归进行划分.直至数组元素有序.
具体详细的解释在代码注释中
代码如下:

#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;
}

输出结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值