算法基础,排序之快速排序。
基本原理
-
1.设定一个基准数(用来参照的数)。
-
2.将基准数移到序列的中间位置(左边的数都小于它,右边的数都大于它)。
-
3.以这个基准数为界将这个序列分为两部分,对每一部分进行第一步的操作。(分部之后的过程就要用到递归的思想)
-
4.结束,输出结果
-
具体流程请看流程图
难点
- 如何将基准数放到序列中间? 方法就是:从序列的两端分别设定两个小球 i , j ,让它们分别从两端开始相向滚动,当 j
碰到一个比基准数小的停下来(一定要让 j 先滚动),i 再碰到一个比基准数大的数,将 i 和 j
所指向的元素交换,两小球继续相向滚动,直到两小球相遇的时候结束,交换基准数和 i 所指向的元素,一轮结束。 - 递归思想的应用。
好了说了这么多,先上代码:
#include<stdio.h>
int n,a[101];//定义全局变量
void quicksort(int left,int right)
{
int i,j,temp,t;
if(left>right)
return;
t=a[left];//设定基准数
i=left;
j=right;
while(i!=j)
{
while(a[j]>=t&&i<j)//先让j移动
j--;
while(a[i]<=t&&i<j)//i再移动
i++;
//找到符合要求的两个元素,交换他们在数组中的位置
if(i<j)//当两个小球没有相遇时
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
//让基准数到达中间
a[left]=a[i];
a[i]=t;
//接下来重点来了
//递归思想的应用
quicksort(left,i-1);//继续处理左边的
quicksort(i+1,right);//继续处理右边的
return ;
}
int main ()
{
int i,j;
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]);
getchar();getchar();
return 0;
}
输入数值验证
10
5 4 8 2 0 1 6 8 3 7
运行结果如下:
0 1 2 3 4 5 6 7 8 8
备注
-
那么从大到小又怎么排呢?
很简单只需要改变最后一步 a[i] 数组从 1 到 n ;i++改为从 n 到 1 ;i–就可以了(是不是很简单)
-
我自己的理解都在这了 希望对你有所帮助!