算法学习 2
最常用的排序----快速排序
说到排序算法,大家都会想到的算法会有冒泡排序、桶排序等,快速排序也是比较常用的排序算法之一,下面是本人学习快速排序的时候的一些总结,有不对的地方还希望大家指正!
算法思想:
对于一个序列,我们此时需要将序列进行升序排列,使用快速排序首先需要设置一个基准数(一般选取当前序列的第一个数作为这个基准数),此时设置两个哨兵,这里我们将两个哨兵分别取名为哨兵i和哨兵j,哨兵i放在序列最前面,哨兵j放在序列末尾;我们使用一个变量先存放这个基准数,随后让哨兵j从后面开始往前寻找一个比当前基准要小的数据,找到后停下,随后哨兵i从前往后找,找到一个比基准数大的数据的时候停下(此时哨兵i与j没有碰面),交换哨兵i与哨兵j所指向的数据。随后继续上述操作,直到哨兵i与哨兵j碰面的时候,交换此时哨兵所指向的数据与基准数据,交换完成后,第一轮结束;随后从上一轮基准处将序列分成两个序列,对这两个序列进行上面的操作,直到最后完成排序。
讲述了上面的算法思想时候可能还有人没有弄清楚,没关系,可能是我表达上有些问题,接下来我将会使用图形与文字结合的方式进行讲解。
假设现有一组数据 2 4 5 1 3 需要使用快速排序的方法进行排序,具体实现如下:
1. 将哨兵i和哨兵j分别放置在序列的最前面和最后面(此时将基准设置为序列最前面的数据 2);
2. 由哨兵j开始向前寻找一个小于基准的数据,找到这个数据为1;
3. 哨兵i开始从前向后寻找,找到一个大于基准的数据;
4. 交换哨兵i与哨兵j所指向的数据的位置;
5. j继续向前寻找,此时哨兵j找不到比基准数小的数据,然后会一直向前直到与哨兵i相遇,相遇之后需要交换哨兵i与j所指的数据和基准数据;
6. 从当前哨兵相遇位置作为分界点,2前面的数据进行快速排序(此时只有数据1,不用进行排序),2后面的数据接着进行快速排序。
一定要停下来自己试一试,确保自己试完之后再看后面哦!
对序列 5 4 3再进行排序
发现此时哨兵j所指数据小于基准,j不做变化,i向后寻找大于基准的数据,发现直到与哨兵j碰面的时候还是没有找到,交换两者相交后所指数据与基准的位置
排序完成,最后总序列排序所得结果为:
相信讲解到这里大家应该都明白快速排序的基本思想了吧!
看到这里不如给小编点个👍吧!
接下来就是最最最重要的,代码实现了,还是希望你可以自己先思考思考怎么样实现,这样对自己的写代码能力才有提升哦!
代码实现:
#include <stdio.h>
int a[100],n;
void quicksort(int left,int right){
int i,j,t,temp;
if(left>right)
return; //排除没有输入数据的情况
temp=a[left]; //将队列最左边的值作为基准数
i=left; //哨兵i放在最左边
j=right; //哨兵j放在最右边
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]; //当哨兵i与j碰面之后,交换基准数与这个数据
a[i]=temp;
quicksort(left,i-1); //继续处理左边的数据
quicksort(i+1,right); //继续处理右边的数据
}
int main()
{
int i,j,t;
//读入数据
printf("请输入你想要输入的数据的个数:");
scanf("%d",&n); //输入你想要输入的数据的个数
printf("请输入%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();
return 0;
}
快速排序就讲解到这里,可以关注小编或者给小编一个小小的赞哦!!😍