快速排序(小兵和长官的那些事)最快了解

快速算法核心为分而治之

  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是进行递归,分治;

结果图:

猜你喜欢

转载自blog.csdn.net/weixin_54107527/article/details/117785185