重新复习一遍算法。
之前有个桶排序和冒泡排序。这两个都比较简单,就先从快排开始,有时间再看一遍。
先讲讲原理:
比如输入的数据是 5 6 2 4 9
先取第一个数5,称这一个是基准数 然后从最后找到第一个比5小的,假设这个下标用j表示。再从第一个数开始找到第一个比基准数大的,假设这个下标用i表示。分别是4和6讲这两个数交换,变成了 5 4 2 6 9。再继续找。(必须j先开始)j到2比基准数小,然后i到2时候和j相遇。表示查找结束,交换基准数和2。变成2 4 5 6 9。现在看起来顺序正好了,但是还不能停止。从5将左右两边分开。左边2 4 5继续再从第一个数开始比较,第一个数2为基准数,j从5开始,i 从2开始。最后还是2 4 5。然后比较之前没比较的右边,6 9 比较。比较6,j从9,i从6开始。j到6与i相遇停止 然后还是6 9.这样一个快速排序完成。代码如下
#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;
printf("scanf:");
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;
}
大家理解了代码之后。想想为什么要从右边开始而不是从左边开始。
然后再出个题目 这里快排是从小到大,如果从大到小排列呢?
其实就改一处就好了。。。与基准数的比较i大于基准数,j小于基准数。