快速排序
快排的核心就是分治递归技术,简而言之就是不断的把大问题划分为小问题,利用小问题的解可以得出大问题的解,小问题再继续划分小小问题…..直到可以直接求出或较为简单的求出小小小…问题的解,即此时找到了递归出口。把这个小小小…问题的解记录下来并提交回上级,那么上级小小小..问题的解也解决了,然后就不断地返回,直到最大级别的大问题,此时我们的问题就解决了。然后明白这个思想了,就来看看这种思想在快速排序中的运用,首先我们得到了一串数字a1,a2,a3…..a10。我们首先(习惯性)把a1作为关键数据然后先把它取出来(随便定义个变量,把a1赋予它):x = a1.这时候再在a1与结尾处分别设置一个浮动小标记。i,j(i=1,j=n)。此时就开始比较了(先从后面比较),1.a[j]比x小(之所以要比较小,因为我想让排好后的序列按从大到小排列)的话,就把它赋予a[i](可能有的朋友不明白为什么是直接赋予,疑惑a[i]处的值不就直接被抹盖了么,其实不然,i = 1时,x已记录了它的值,此时a[i]可看为无用空间,即使被掩盖也无所谓,如果被掩盖的话a[i]与a[j]处的值相同,a[j]就变为无用空间了,等待着找到的下个值来赋予它),然后j–,否则就直接执行j–(即a【j】小于a【i】) .好了,我们第一次的选择判断完了,此时在a[i]左边都是比a[i]小的值,在a[i]右边都是比a[i]大的值,此时或许有朋友问,可是此时左右都是无序数列啊,对,没错不过不急,我们继续重复此以上步骤,将左边,右边分别进行以上步骤,不断砍为两部分最后砍的一个序列只剩三个数,一次排序后就有序了(即有序后无法再递归下去)那么就可以向上返回了,(好似向上级报告,我们这一队列有序了),很多段都有序后向上级报告我们有序了,那么这许多段就组成了有序数列。此时,该数列就有序了
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(a[j]>=temp && i<j)
j--;
//再找右边的
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}