快速排序(抽象理解,最快了解)

快速算法核心为分而治之

  1. 选取第一个数为基准

  2. 将比基准小的数交换到前面,比基准大的数交换到后面

  3. 对左右区间重复第二步,直到各区间只有一个数

基准就是长官。小兵任务是给长官找个好地方。

这里可以理解为j小兵不害怕比长官的,而i小兵不害怕比长官小的,小兵是不能后退,那么只有两个小兵调换位置就可以继续向前走了) 

 j小兵从8开始,比长官6大的那么就继续向前,到比6小的5上面停止移动,等待命令,然后i小兵开始向前移动,碰到比自己小的跳过,比自己大的停止,然后两个小兵调换位置,继续如此直到两个小兵见面。

然后长官去他们找到的位置,他们去去长官原来的位置进行保护。

6    1    2    7    9    3    4    5    10    8
i                                          j
 

6    1    2    7    9    3    4    5    10    8
                   i                      j        

6    1    2    5    9    3    4    7    10    8
                   i                       j        
------------------------------------------------------------------

剩下的便是继续这个步骤,如图:

具体代码如图: 

/***********************************************************
*版权所有:(C) 2021.6.10  烽火副队(第八方面军) 
* 
*文件名称:快速算法(小兵与长官那些事) 
*内容摘要:算法 
*当前版本: 
*文件作者:周红 
*完成日期:2021.6.10
*
*修改记录:暂无 
***********************************************************/
#include<stdio.h> 
int fun(int a[],int low,int high){
	//low;序列第一个元素 
	//high;序列最后一个元素 
	int arr;
	int tmp=a[low];//tmp基准 
	int arr1=low;			//暂时存放基准位置 
	if(low>=high)            //如果满足这个条件函数结束 
		return 0;
	while(low<high){			 
		while(tmp <= a[high]&&low<high)		// 集准小于最后面的一个元素,元素下标-1 
			high--;					
		while(low<high&&tmp>=a[low])       // 集准大于前面的一个元素,元素下标+1     
			low++;
		arr=a[low];
		a[low]=a[high];
		a[high]=arr; 						//不满足上面两个while条件则换位 
	}
	arr=a[low];
	a[low]=tmp;
	a[arr1]=arr;		//将基准和中间调换 
	return low;       //返回基准位置 
} 
void fun1(int a[],int low,int high){//递归 
	if(low<high){
		int index=fun(a,low,high);
		fun1(a,low,index-1);
		fun1(a,index+1,high);
	}	
}
int main(){
	int n;
	printf("请输入排序总位数:\n"); 
	scanf("%d",&n);
	int a[n];
	printf("请输入排序的元素:\n"); 
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	fun1(a,0,n-1);		
	printf("排完序的元素为:\n"); 
	for(int j=0;j<n;j++)
		printf("%d   ",a[j]);
	return 0;
}

fun主要实现基准前后进行比较大小;

fun1是进行递归,分治;

结果图:

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵hong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值