首页 > 编程 > C++ > 正文

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

2020-05-23 14:15:48
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C语言的冒泡排序和快速排序算法使用实例,示例题目也是ACM练习当中的基础习题,需要的朋友可以参考下

冒泡排序法

题目描述:

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

输入:

输入第一行包括一个整数N(1<=N<=100),代表学生的个数。

接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

输出:

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

如果学生的成绩相同,则按照学号的大小进行从小到大排序。

样例输入:

3

1 90

2 87

3 92

样例输出:

2 87

1 90

3 92

代码:

 

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.  
  4. struct student  
  5. {  
  6. int number;  
  7. int score;  
  8. };  
  9.  
  10. int main()  
  11. {  
  12. struct student students[101];  
  13. int n, i, j;  
  14. struct student temp;  
  15.  
  16. while(scanf("%d",&n) != EOF)  
  17. {  
  18. //接收数据  
  19. for(i = 0; i < n; i++)  
  20. {  
  21. scanf("%d%d",&students[i].number,&students[i].score);  
  22. }  
  23.  
  24. //冒泡排序  
  25. for(i = 0; i < n - 1; i ++)  
  26. {  
  27. for(j = 0; j < n - i - 1; j ++)  
  28. {  
  29. if(students[j].score > students[j + 1].score)  
  30. {  
  31. temp = students[j];  
  32. students[j] = students[j + 1];  
  33. students[j + 1] = temp;  
  34. }else if(students[j].score == students[j + 1].score)  
  35. {  
  36. if(students[j].number > students[j + 1].number)  
  37. {  
  38. temp = students[j];  
  39. students[j] = students[j + 1];  
  40. students[j + 1] = temp;  
  41. }  
  42. }  
  43. }  
  44. }  
  45.  
  46. //输出排序结果  
  47. for(i = 0; i < n; i ++)  
  48. {  
  49. printf("%d %d/n",students[i].number,students[i].score);  
  50. }  
  51. }  
  52.  
  53. return 0;  
  54. }  

快速排序法

题目描述:

有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

代码

 

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. struct student{  
  6. char name[101];  
  7. int age;  
  8. int grade;  
  9. };  
  10.  
  11. int partition(struct student *A, int left, int right);  
  12. void quicksort(struct student *A, int begin, int end);  
  13.  
  14. int main()  
  15. {  
  16. struct student students[1001];  
  17. int i, n;  
  18.  
  19. while(scanf("%d",&n) != EOF)  
  20. {  
  21. //学生成绩赋值  
  22. for(i = 0; i < n; i ++)  
  23. {  
  24. scanf("%s%d%d",students[i].name, &students[i].age, &students[i].grade);  
  25. }  
  26.  
  27. //快速排序  
  28. quicksort(students, 0, n-1);  
  29.  
  30. //打印输出  
  31. for(i = 0; i < n; i ++)  
  32. {  
  33. printf("%s %d %d/n",students[i].name, students[i].age, students[i].grade);  
  34. }  
  35. }  
  36.  
  37. return 0;  
  38. }  
  39.  
  40. void quicksort(struct student *A, int begin, int end)  
  41. {  
  42. int pivot;  
  43.  
  44. if(begin < end)  
  45. {  
  46. pivot = partition(A, begin, end);  
  47. quicksort(A, begin, pivot - 1);  
  48. quicksort(A, pivot + 1, end);  
  49. }  
  50. }  
  51.  
  52. int partition(struct student *A, int left, int right)  
  53. {  
  54. struct student stand = A[left];  
  55.  
  56. while(left < right)  
  57. {  
  58. 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 ) ) )  
  59. {  
  60. right --;  
  61. }  
  62. if(left < right)  
  63. {  
  64. A[left ++] = A[right];  
  65. }  
  66.  
  67. 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 ) ) )  
  68. {  
  69. left ++;  
  70. }  
  71. if(left < right)  
  72. {  
  73. A[right --] = A[left];  
  74. }  
  75. }  
  76. A[left] = stand;  
  77. return left;  

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表