5分钟get排序之快速排序

一:前言

最近笔者在复习排序算法,发现很多文章牛头不对马尾。解析写的是一种方法,实现的代码又是另外一种方法,看得笔者头疼。于是,笔者打算特地写这一类排序的文章,为大家解惑。因为,排序其实很简单,就是需要我们注意一些使用的细节就好了。
操作环境:Visual C++ 6.0
适用版本:王道版数据结构、李春葆版数据结构

二:操作

快速排序思想:在一组数据中,选取第一个元素或者最后一个元素为基准,将大于基准的元素放在基准右边,小于基准的放在基准左边。然后,继续寻找基准,根据基准划分元素位置,直至新的基准左右没有元素。
操作视频版:因为不知道怎么在CSDN里面放视频,所以笔者上传到了B站→5分钟get快速排序

三:代码

实现语言:C语言
步骤:我代码中的数组为{6,1,2,7,9,3,4,5,10,8,45},基准设为左边第一个6,所以先从右到左,找比6小的,再从左到右,找比6大的元素。
(若基准设为右边第一个,就先从左到右,找比6大的,再从右到左,找比6小的)
(细节处都注释在代码中)

#include<stdio.h>
#include<stdlib.h>
//输出元素方法
void display(int arr[],int size){
	int i;
	for(i=0;i<size;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
//寻找基准方法
int partition(int arr[],int i,int j){
	//保存基准
	int key = arr[i];
	while(i<j){
		//首先从右边寻找小于基准的元素
		while(i < j && arr[j] >= key){
			j--;
		}
		//找到一个小于基准的元素
		if(i<j){
			arr[i] = arr[j];
		}
		//接着从右边寻找大于基准的元素
		while(i < j && arr[i] <= key){
			i++;
		}
		//找到一个大于基准的元素
		if(i<j){			
			arr[j] = arr[i];
		}
	}
	//完成一趟快速,将i=j的元素赋值为基准。
	arr[i] = key;
	//赋值完,基准左边就是小于基准的,右边就是大于基准的
	return i;
}
//递归调用方法
void quickSort(int array[],int left,int right){
	int pos;
	if(left<right){
		pos = partition(array,left,right);
		//基准左边的元素
		quickSort(array,left,pos-1);
		//基准右边的元素
		quickSort(array,pos+1,right);
	}
}
//主函数
int main(){
	int arr[] = {6,1,2,7,9,3,4,5,10,8,45};
	//用arr占用内存大小除以一个int型占用大小,然后就是arr中包含的int元素的个数了
	int size = sizeof(arr)/sizeof(int);
	quickSort(arr,0,size-1);
	display(arr,size);
	return 0;
}

四:尾言

快速排序的重点就是确定那个基准,然后根据分治法的思想,将大于基准的和小于基准的划分开,最后剩下的区域只有一个元素,即基准本身时,排序成功,再将所有元素合并起来。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值