zoukankan      html  css  js  c++  java
  • 【算法】常用的排序方法

     这里总结了几种排序方法,直接有函数可以调用。

    sort头函数:

    //sort.H

    #ifndef SORT_H
    #define SORT_H

    void InsertSort(int arry[],int n);

    void DubbleSort(int arry[],int n);

    void SelectionSort(int arry[],int n);

    #endif

     

    sort主函数:

    #include <stdio.h>
    #include <stdlib.h>
    #include "sort.h"

    //代码

    插入排序:

    void InsertSort(int arry[],int n)
    {
      int i,j,temp;
      for (i=1;i<n;i++)
      {
        temp = arry[i];
        j=i-1;
        while (j>-1 &&temp<arry[j])
        {
          arry[j+1]=arry[j];
          j--;
        }
        arry[j+1]=temp;
      }
      for(i=0;i<n;i++)
        printf("%d ",arry[i]);
    }

    冒泡排序:

    void DubbleSort(int arry[],int n);
    {
      int i,j,temp;
      for(j=0;j<n-1;j++)
      for(i=0;i<n-1-j;i++)
      {
        if(arry[i]>arry[i+1])
        {
          temp=arry[i];
          arry[i]=arry[i+1];
          arry[i+1]=temp;
        }
      }
      for(i=0;i<n;i++)
        printf("%d ",arry[i]);
    }

    选择排序:

    void SelectionSort(int arry[],int n);

    {
      int i,j,k,temp;
      for(i=0;i<n;i++)
      {
        k=i;
        for(j=i+1;j<n;j++)

        {

          if(arry[j]<arry[k]) k=j;

        }

        temp=arry[k];
        arry[k]=arry[i];
        arry[i]=temp;
      }
      for(i=0;i<n;i++)
        printf("%d ",arry[i]);

    }

    主函数:

    #include <stdio.h>
    #include <stdlib.h>
    #include"sort.h"
    int main()
    {
      int arry[10]={2,4,12,0,-1,6,8,3,1,12};

      int1 n=10;

      //选择功能函数
      return 0;
    }


    对于排序,我们一直使用的是自己编写排序函数,但是在机试中,对待不同规模的数组我们不可能在内存和时间限制下编写一个合适的排序函数。这个时候可以使用C++中的内部函数sort( )

    下面是一个升序排序案例:

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int n;
        int buf[10000];
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++){
                scanf("%d",&buf[i]);
            }
            sort(buf,buf+n);//这里的俩个参数表示排序内存起始地址和结束地址
            for(int i=0;i<n;i++){
                printf("%d",buf[i]);
            }
            printf("
    ");
        }
        return 0;
    }

    如果要降序的话,需要对sort( )函数进行重载。此时我们需要定义一个cmp函数。为了降序排列,我们判断两个参数的大小,当第一个参数比第二个参数大时返回true。

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    
    bool cmp (int x, int y)//当cmp返回值为true时,即表示cmp函数的第一个参数将会排在第二个参数之前
    {
        return x>y;
    }
    
    int main ()
    {
        int n;
        int buf[10000];
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++){
                scanf("%d",&buf[i]);
            }
            sort(buf,buf+n,cmp);//此时函数重载了
            for(int i=0;i<n;i++){
                printf("%d",buf[i]);
            }
            printf("
    ");
        }
        return 0;
    }

     接下来是对结构体数值的排序。同理。

    比如:将N个学生数据从高到低排序,如果成绩相同则按照姓名字符的字母排序,如果姓名的字母也相同则按照学生的年龄排序。

    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    struct E{
        char name[100];
        int age;
        int score;
        }buf[100];
    
    bool cmp (E a,E b)
    {
        if(a.score!=b.score) return a.score<b.score;//成绩高低排序
        int tmp =strcmp(a.name,b.name);
        if(tmp != 0) return tmp<0;//如果成绩相同,就按照姓名字符排序
        else return a.age>b.age;//成绩相同,姓名字母序相同则按照学生年龄排序
    }
    
    int main ()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
            }
            sort(buf,buf+n,cmp);
            for(int i=0;i<n;i++)
            {
                printf("%s %d %d
    ",buf[i].name,buf[i].age,buf[i].score);
            }
        }
        return 0;
    }
  • 相关阅读:
    Windows操作系统堆和栈的区别
    API1——CppSparseFile
    typedef struct 用法详解和用法小结
    开发人员应该用好的一些网站
    Windows编程中的堆管理
    在VC中编译、运行程序的小知识点
    Script:列出数据库中5%以上链式行的表
    解决Linux上11g的ORA00845错误
    Oracle内部错误:ORA00600[kfioTranslateIO03]一例
    Oracle内部错误:ORA00600[2608]一例
  • 原文地址:https://www.cnblogs.com/guangluwutu/p/4271095.html
Copyright © 2011-2022 走看看