C语言的冒泡排序和快速排序算法使用实例

所属分类: 软件编程 / C 语言 阅读数: 97
收藏 0 赞 0 分享

冒泡排序法

题目描述:

    用一维数组存储学号和成绩,然后,按成绩排序输出。

输入:

    输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
    接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

输出:

    按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
    如果学生的成绩相同,则按照学号的大小进行从小到大排序。

样例输入:

    3
    1 90
    2 87
    3 92

样例输出:

    2 87
    1 90
    3 92

代码:

     

  #include <stdio.h> 
    #include <stdlib.h> 
     
    struct student 
    { 
      int number; 
      int score; 
    }; 
     
    int main() 
    { 
      struct student students[101]; 
      int n, i, j; 
      struct student temp; 
     
      while(scanf("%d",&n) != EOF) 
      { 
        //接收数据 
        for(i = 0; i < n; i++) 
        { 
          scanf("%d%d",&students[i].number,&students[i].score); 
        } 
     
        //冒泡排序 
        for(i = 0; i < n - 1; i ++) 
        { 
          for(j = 0; j < n - i - 1; j ++) 
          { 
            if(students[j].score > students[j + 1].score) 
            { 
              temp = students[j]; 
              students[j] = students[j + 1]; 
              students[j + 1] = temp; 
            }else if(students[j].score == students[j + 1].score) 
            { 
              if(students[j].number > students[j + 1].number) 
              { 
                temp = students[j]; 
                students[j] = students[j + 1]; 
                students[j + 1] = temp; 
              } 
            } 
          } 
        } 
     
        //输出排序结果 
        for(i = 0; i < n; i ++) 
        { 
          printf("%d %d\n",students[i].number,students[i].score); 
        } 
      } 
       
      return 0; 
    } 

快速排序法


题目描述:

        有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

输入:

        测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
        每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。

输出:

        将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
        然后输出学生信息,按照如下格式:
        姓名 年龄 成绩

样例输入:

    3
    abc 20 99
    bcd 19 97
    bed 20 97

样例输出:

    bcd 19 97
    bed 20 97
    abc 20 99

代码

  #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
     
    struct student{ 
      char name[101]; 
      int age; 
      int grade; 
    }; 
     
    int partition(struct student *A, int left, int right); 
    void quicksort(struct student *A, int begin, int end); 
     
    int main() 
    { 
      struct student students[1001]; 
      int i, n; 
     
      while(scanf("%d",&n) != EOF) 
      { 
        //学生成绩赋值 
        for(i = 0; i < n; i ++) 
        { 
          scanf("%s%d%d",students[i].name, &students[i].age, &students[i].grade); 
        } 
     
        //快速排序 
        quicksort(students, 0, n-1); 
     
        //打印输出 
        for(i = 0; i < n; i ++) 
        { 
          printf("%s %d %d\n",students[i].name, students[i].age, students[i].grade); 
        } 
      } 
     
      return 0; 
    } 
     
    void quicksort(struct student *A, int begin, int end) 
    { 
      int pivot; 
     
      if(begin < end) 
      { 
        pivot = partition(A, begin, end); 
        quicksort(A, begin, pivot - 1); 
        quicksort(A, pivot + 1, end); 
      } 
    } 
     
    int partition(struct student *A, int left, int right) 
    { 
      struct student stand = A[left]; 
     
      while(left < right) 
      { 
        while(left < right && (A[right].grade > stand.grade || (A[right].grade == stand.grade && strcmp(A[right].name,stand.name) > 0) || (A[right].grade == stand.grade && strcmp(A[right].name,stand.name) == 0 && A[right].age > stand.age ) ) ) 
        { 
          right --; 
        } 
        if(left < right) 
        { 
          A[left ++] = A[right]; 
        } 
     
        while(left < right && (A[left].grade < stand.grade || (A[left].grade == stand.grade && strcmp(A[left].name,stand.name) < 0) || (A[left].grade == stand.grade && strcmp(A[left].name,stand.name) == 0 && A[left].age < stand.age ) ) ) 
        { 
          left ++; 
        } 
        if(left < right) 
        { 
          A[right --] = A[left]; 
        } 
      } 
      A[left] = stand; 
      return left; 
    } 

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多