快速排序
要点:
- 先找关键字;
- 从数组最后面的开始查找,只要比关键字大,就继续查找(此时j–)/交换位置,从前面开始查找;
- 从前面开始的售后,直到有数据比他大,就交换;
- 当 i==j 结束。
主要使用递归思想,找到关键字,一般都是一第一个为关键字,然后先从后面比较,发现比关键字小的之后交换位置,再从左边开始遍历,如果发现比关键字大的再交换位置。
具体代码如下:
#include<stdio.h>
int a[10]={5,7,6,9,2,12,4,3};
void swap(int *b,int *c){
int t;
t=*b;
*b=*c;
*c=t;
}
void quickSort(int a[],int s,int e){
if(s>=e) return;
int i,j;
int k;//关键字
k=a[s];
i=s;
j=e;
while(i!=j){
while(i<j&&a[j]>=k)
--j;
swap(&a[i],&a[j]);
while(i<j&&a[i]<=k)
i++;
swap(&a[i],&a[j]);
}
quickSort(a,s,i-1);
quickSort(a,i+1,e);
}
main()
{
int i;
quickSort(a,0,7);
for(i=0;i<7;i++)
printf("%d ",a[i]);
printf("%d\n",a[7]);
return 0;
}
例题:(航电 oj 上一道名为 sort 的算法题)
(刚好可以用到快排)
代码如下:
#include<stdio.h>
int a[1000006];
int n,m;
void swap(int *b,int *c){
int t;
t=*b;
*b=*c;
*c=t;
}
void quickSort(int a[],int s,int e){
if(s>=e) return;
int i,j;
int k;//关键字
k=a[s];
i=s;
j=e;
while(i!=j){
while(i<j&&a[j]>=k)
--j;
swap(&a[i],&a[j]);
while(i<j&&a[i]<=k)
++i;
swap(&a[i],&a[j]);
}
quickSort(a,s,i-1);
quickSort(a,i+1,e);
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m)){
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quickSort(a,0,n-1);
for(i=n-1;i>n-m;i--)
printf("%d ",a[i]);
printf("%d\n",a[n-m]);
}
return 0;
}