各种排序算法整理(附带习题及代码)

模板部分(想背的就背一下吧,但是不建议……毕竟排序用sort函数就行了,这些排序的算法只是为了锻炼你的思维逻辑能力罢了):

1.选择排序

#include<cstdio>

#define N 100000+100

int a[N],n;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      for(int i=1;i<n;i++)
        {
            int k=i;
            for(int j=i+1;j<=n;j++)
              if(a[j]<a[k]) k=j;
            if(k!=i)
              {
                  int p=a[k];
                  a[k]=a[i];
                  a[i]=p;
              }
        }
    for(int i=1;i<n;i++)
      printf("%d ",a[i]);
    printf("%d",a[n]);
      return 0;
  }
View Code

2.冒泡排序

#include<cstdio>
#include<iostream>

#define N 100000+100

int a[N],n;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
          if(a[j]<a[i])
            {
                int p=a[i];
                a[i]=a[j];
                a[j]=p;
            }
      for(int i=1;i<n;i++)
        printf("%d ",a[i]);
      printf("%d",a[n]);
      return 0;
  }
View Code

3.桶排序

#include<cstdio>

#define N 100000+100

int a[N],n;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        {
            int k;
            scanf("%d",&k);
            a[k]++;
        }
      for(int i=0;i<N;i++)
        while(a[i]!=0)
          {
              printf("%d ",i);
              a[i]--;
          }
      return 0;
  }
View Code

4.插入排序

#include<cstdio>
#include<cstring>

#define N 100000+100

int k,a[N],n,m=1;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      for(int i=2;i<=n;i++)
        {
            int x=a[i];
            int j=i-1;
            while(x<a[j])
              {
            a[j+1]=a[j];
            j--;
                 }
          a[j+1]=x;
        }
    for(int i=1;i<=n;i++)
      printf("%d ",a[i]);
      return 0;
   } 
View Code

5.快速排序

#include<cstdio>

#define N 100000+100

int n,a[N];

void qsort(int l,int r)
  {
      int mid=a[(l+r)/2];
      int i=l,j=r,p;
      do
        {
            while(a[i]<mid) i++;
            while(a[j]>mid) j--;
            if(i<=j)
              {
                  p=a[i];
                  a[i]=a[j];
                  a[j]=p;
                  i++;j--;
              }
        }while(i<=j);
    if(l<j) qsort(l,j);
    if(i<r) qsort(i,r);
      
  }

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      qsort(1,n);
      for(int i=1;i<=n;i++)
        printf("%d ",a[i]);
      return 0;
  }
View Code

6.sort函数(这部分就不介绍了,想学的去网上找吧)

#include<cstdio>
#include<algorithm>

#define N 100000+100

using namespace std;

int a[N],n;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      sort(a+1,a+n+1);
      for(int i=1;i<n;i++)
        printf("%d ",a[i]);
      printf("%d",a[n]);
      return 0;
   } 
View Code

习题部分:

1.codevs1076

#include<cstdio>
#include<algorithm>

#define N 100000+100

using namespace std;

int a[N],n;

int main()
  {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
      sort(a+1,a+n+1);
      for(int i=1;i<n;i++)
        printf("%d ",a[i]);
      printf("%d",a[n]);
      return 0;
   } 
View Code

2.codevs 1361 知识排名

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1001][1001];
structnode{
  int ID;
  int sum;
 }s[1001];
int cmp(node q,node p){
 if(q.sum!=p.sum)return q.sum>p.sum;
 else return q.ID<p.ID;}
int main(){
int i,j,N,M,id,b[1001];
    memset(b,0,sizeof(b));
    memset(s,0,sizeof(s));
    cin>>id>>N>>M;
    
    for(i=1;i<=N;i++)
       for(j=1;j<=M;j++)
         cin>>a[i][j];
    for(j=1;j<=M;j++)
       for(i=1;i<=N;i++)
        if(a[i][j]==0)b[j]++;
    for(i=1;i<=N;i++)
    { s[i].ID=i;  
      for(j=1;j<=M;j++)
        if(a[i][j]==1)s[i].sum+=b[j];
    }
    sort(s+1,s+1+N,cmp);
    for(i=1;i<=N;i++)
        if(s[i].ID==id){cout<<i;break;}
return 0;
}
View Code
原文地址:https://www.cnblogs.com/yuemo/p/5565071.html