排序算法基础

来源:互联网 发布:机器学习实战smo算法 编辑:程序博客网 时间:2024/06/02 05:12

介绍几种基础的排序方法:
一、选择排序:
以升序(从小到大)为例:选择排序的主要思想就是从所有的数中选取最小的放在第一个位置,再从剩下的数中选取第二小的放在第二个位置。降序与之同理。这里写图片描述
附上关键代码:

//升序为例:    for(int i=1; i<=n-1; i++)  //进行n-1次排序,n是数据个数       for (int j=i+1; j<=n; j++)  //将第i个数与其后所有数比较选取最小的赋到a[i]的位置;                                   if(a[i]>a[j]) swap(a[i],a[j]);

二、冒泡排序:
以升序为例:冒泡排序的主要思想是从头开始,相邻的两个数依次进行比较大小,如果后面的比前面小就交换位置。降序与之同理。这里写图片描述
附上关键代码:

//升序为例:for(int i=1;i<=n-1;i++)                   //冒泡法排序       for(int j=1;j<=n-i;j++)           if (a[j]>a[j+1]) swap(a[j],a[j+1]);  //比较与交换

三、快速排序:
快速排序是最常使用的一种排序方式。利用自带函数,方便快捷且比以上两种更快速,而且通过自设比较方式,可以做到多关键字排序等其他排序不具有的优势。系统默认的升序排列:sort(a,a+n);意思是从小到大将a[0]到a[n]进行排序,以此类推,sort(a+1,a+n)是指从a[1]到a[n]进行排序。降序排列则需要自定义比较方式:
附降序与多关键字排序的代码:

//降序bool comp(const int &a,const int &b)//自设比较函数 {  return a>b;   //降序排列 }int main(){    scanf("%d",&n);                               for (i=1; i<=n; i++)                      scanf("%d",&a[i]);//读入n个数据       sort(a+1,a+n+1,comp); //自设比较函数加comp来调用        }
//STL多关键字排序 struct student {    int zf,sx,xh;//总分、数学、学号}a[10000]; bool comp(const student &a,const student &b) //自设比较函数 {  if (a.zf!=b.zf) return a.zf>b.zf;   //第一关键字,按总分从高到低排序   if (a.sx!=b.sx) return a.sx>b.sx;   //第二关键字,在总分相同的情况下,按数学从高到低排序   return a.xh<b.xh;                  //第三关键字,在总分、数学都相同的情况下,按学号从低到高排序 }int main(){     scanf("%d",&n);                                for (i=1; i<=n; i++)                           scanf("%d%d%d",&a[i].zf,&a[i].sx,&a[i].xh);//读入数据    sort(a+1,a+n+1,comp); //排序,升序排列     }

除以上三种外,还有其他排序方式如归并排序等,以后将会在别的地方进行讲述。

0 0