快速算法核心为分而治之
-
选取第一个数为基准
-
将比基准小的数交换到前面,比基准大的数交换到后面
-
对左右区间重复第二步,直到各区间只有一个数
(基准就是长官。小兵任务是给长官找个好地方。
这里可以理解为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是进行递归,分治;
结果图: