旁白:算法小白白一枚,突然要掌握算法。花废了2个小时把一些基本的知识掌握。包括伪代码书写规则、算法设计技术和时间复杂性的计算弄清楚。本打算用本子做笔记,一想发现没笔、没本子,这对本在疫情被困在家的我来说是一笔“巨额”,所以想到写博客,一方面刚接触感觉有点意思,另一方面当做笔记随时可以复习看看…
废话不多说,本文章主要介绍的是快速排序这一算法。
关于快速排序,最重要的是要懂它如何实现的原理,通过昨天在网上查找资料,发现一个博主讲的快速排序的原理很通俗易懂,下面贴出超链接,原理还不懂的小伙伴可以先去把原理弄懂:在马桶上看算法
看到这里来了,我相信小伙伴们应该对快速排序的原理比较了解了,那么问题来了,怎么样把原理变成代码呢?不要换,接下来我会一步一步的贴出代码。
快速排序主要是利用分治法来解决,利用分治法那么少不了伪代码了(分治法不懂得可以翻书或者上网冲浪)。
这是我刚学的伪代码,自己尝试着写的(有问题的,各位看官希望能指出来呀)
1 quicksort(A,left,right,i,j,t,temp)
2 temp←A[left]
3 i←left
4 j←right
5 while i!=j
6 do
7 while A[j]>=temp&&i<j
8 do j←j+1
9 if A[i]>=temp&&i<j
10 then i←i+1
11 交换A[i]和A[j]
其中A是数组,left和right是参数,i,j是下标,t是中间转换需 要的,temp是基准数
emm…大致就是这个过程,找准一个基准数,然后下标从两头向中间滑动,满足条件就交换位置…
下面就是写程序,实现这个算法。(以C为例)
#include <stdio.h>//库函数,不用多说
int a[7],n;//定义一个数组和n
void quicksort(int left, int right)//定义快速排序函数quicksort,两个参数分别是left和right
{
int i,j,t,temp;//定义下标i,j和基准数temp,t在后面交换位置需要用的
if(left>right)//最先判定,必须要有的
return ;
temp=a[left];//把基准数放在最左边一个
i=left;//赋值
j=right;//赋值
while(i!=j)
{
while(a[j]>=temp&&i<j) //从右往左找,找比temp大的数
j--;
while(a[i]<=temp&&i<j)//从左往右找,找比temp小的数
i++;
//交换位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//继续循环
quicksort(i+1,right);//继续循环
}
int main()
{
int i,n=7;
printf("输入7个杂序的数字:");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
//输出排序后的结果
for(i=1;i<=n;i++)//for循环,依次输出
printf("%d",a[i]);
getchar();
getchar();
return 0;
}
运行结果: