用c语言实现快速排序法
快速排序法感觉听名字它的排序速度就特别快,但是它可并不是最快的排序方法,所有的排序方法的速度都是相对的,没有绝对的最快,如果对于比较杂乱的一组数,快排是一种很好的选择。好了,先讲一讲快排的思想。
现在假如你有一组数需要排序,例如下面这组数:
6 1 2 7 9 3 4 5 10 8
首先我们可以找一个基准数,一般选取最左边,就是6(现在知道为啥我要把6的颜色加深了吧)
现在我们需要做的事就是把比6小的数放在6的左面,把比6大的数放在6的右面。我们先把这串数字存进一个数组中,我们可以找两个变量,一个记做i,一个记做j,它们分别表示这个数组最左边和最右边两个数组的下标,让i从左往右遍历,让j从右往左遍历,这里要注意,因为基准数选取的是最左端,所以让j先从右往左遍历(否则可能发生数组越界问题),当j遍历到一个比6小的数时让它停下,i遍历到一个比6大的数时也让它停下,然后交换i j下标所对应的数,然后继续遍历,直到i,j相遇,相遇时将基准数与相遇时ij下标所对应的数交换,这样一遍下来6左边都是比它小的数了和6右边都是比它大的数了,然后再用相同的方法排左边和右边的数,这里写一个递归函数就解决了,现在我在下面模拟一下过程:
6i 1 2 7 9 3 4 5 10 8j
第一次ij停下
6 1 2 7i 9 3 4 5j 10 8
交换两个位置的数
6 1 2 5i 9 3 4 7j 10 8
6 1 2 5 9i 3 4j 7 10 8
6 1 2 5 4i 3 9j 7 10 8
相遇
6 1 2 5 4 3ij 9 7 10 8
3 1 2 5 4 6ij 9 7 10 8
然后相同的方法排
3 1 2 5 4
9 7 10 8
下面直接给出代码
#include<stdio.h>
void quicksort(int left,int right);
int a[100];//定义一个全局数组
int main()
{
int b;
printf("请输入你要排序的个数");
scanf("%d",&b);
for(int c=1;c<=b;c++)
{
scanf("%d",&a[c]);
}
quicksort(1,b);
printf("\n");
for(int d=1;d<=b;d++)
{
printf("%d ",a[d]);
}
return 0;
}
void quicksort(int left,int right)
{
int temp,i,j,t;
if(left>right)//如果左边数直接大于右边数直接pass掉 还有个作用是排好之后跳出递归
return;
temp=a[left];//先将最左边的基准数赋值给一个变量
i=left;
j=right;
while(i!=j)//只要i和j不相遇,则一直循环
{
while(i<j&&a[j]>=temp)//从右往左遍历,遇到比基准数小的则停下
{
j--;
}
while(i<j&&a[i]<=temp)//从左往右遍历,遇到比基准数大的则停下
{
i++;
}
if(i<j)//将两个i j停下地方的数字交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];//交换基准数和ij相遇地方的数字
a[i]=temp;//现在基准数左边的数均比它小,右边的数均比它大
quicksort(i+1,right);//用相同的方法排左边和右边的数
quicksort(left,i-1);
}
我自己的测试结果如下图
如果对代码有疑问的可以在下方评论联系我。