快速排序是学习数据结构必须掌握的一种排序方法,效率很高,经过老师的讲解很想和大家分享~
下面举一个例子来说明。
例如数组:19 6 3 78 34 10
一、找出枢轴并把数组划分成块,枢轴前面的都比枢轴大,枢轴后面的都比枢轴小。
演示过程:
对应代码:
/*寻找枢轴将数组分块*/
int qpass(int data[],int start,int end)
{
int idx=data[start];
while(start<end)
{
/*从后往前找比枢轴小的数*/
while(start<end && data[end]>idx)
{
end--;
}
/*否则就是已经找到比idx小的数,移到前面*/
data[start]=data[end];
/*从前往前找比枢轴大的数*/
while(start<end && data[start]<idx)
{
start++;
}
/*否则就是已经找到比idx大的数,移到后面*/
data[end]=data[start];
}
data[start]=idx;//将idx放在空缺的位置
return start;
}
二、将枢轴左右两侧的数据进行排序
/*将分好的块进行排序*/
void sort(int data[],int start,int end)
{
if(start<end)
{
/*相当于这样的形式[ ] idx [ ]*/
int idx=qpass(data,start,end);//调用找到枢轴
/*枢轴不需要参与排序,递归实现排序(这个过程类似于先序遍历*/
sort(data,start,idx-1);
sort(data,idx+1,end);
}
}
三、完整代码
大家要是觉得还不错的话请点个👍吧~
/*快速排序算法*/
#include<stdio.h>
/*寻找枢轴将数组分块*/
int qpass(int data[],int start,int end)
{
int idx=data[start];
while(start<end)
{
/*从后往前找比枢轴小的数*/
while(start<end && data[end]>idx)
{
end--;
}
/*否则就是已经找到比idx小的数,移到前面*/
data[start]=data[end];
/*从后往前找比枢轴大的数*/
while(start<end && data[start]<idx)
{
start++;
}
/*否则就是已经找到比idx大的数,移到后面*/
data[end]=data[start];
}
data[start]=idx;//将idx放在空缺的位置
return start;
}
/*将分好的块进行排序*/
void sort(int data[],int start,int end)
{
if(start<end)
{
/*相当于这样的形式[ ] idx [ ]*/
int idx=qpass(data,start,end);//调用找到枢轴
/*枢轴不需要参与排序,递归实现排序(这个过程类似于先序遍历*/
sort(data,start,idx-1);
sort(data,idx+1,end);
}
}
int main()
{
int a[100];//自定义大小
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a,1,n);
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
return 0;
}