当前位置:   article > 正文

C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)_交换法排序,从键盘输入6个数,要求按升序排序,输出排序结果。

交换法排序,从键盘输入6个数,要求按升序排序,输出排序结果。

 冒泡法排序:顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。

假如有n个数字,则需要进行n-1轮 

第一轮结果:最大的数,被放在了最后一位

 第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素进行排序

 第三轮:只用将前3个元素排序即可

 第四轮:只用将前2个元素比较即可

 第五轮:只剩下一个元素,直接放在首位,它一定是最小的

 以上就是冒泡排序的步骤

代码如下:

  1. /*冒泡法排序:字面意思为小的数据就好像水中的气泡一样总是逐渐往上升,
  2. 大的数据就像石块一样往下沉,因此称为冒泡法排序法。
  3. 第一轮从a[0]到a[5]依次把两个相邻的元素两两比较;每次比较后,顺序不对,
  4. 则交换两个元素的值,否则不交换。*/
  5. //利用冒泡排序法,对输入的数据安升序排序
  6. #include<stdio.h>
  7. int main() {
  8. int i, j, a[100], t;//数组元素的最大容量为100
  9. int n;
  10. printf("请输入要排序的元素个数:");
  11. scanf("%d", &n);
  12. printf("请输入要排序的元素:");
  13. for (i = 0; i < n ; i++) {
  14. scanf("%d", &a[i]);//将数据放入数组中
  15. }
  16. /*核心部分:i属于[0,n-1)即N-1次循环;j属于[0,n-1-i)*/
  17. for (i = 0; i < n-1 ; i++) {//这里可以写成:i<n;它表示意思是,进行n轮,最后一个没排的元素由于不满足j<n-i-1,因此不用比较,因为它一定是最小的
  18. for (j = 0; j < n - i - 1; j++) {//i<n-1;它的意思是:进行n-1轮,最后一个元素与紧邻右边的元素再进行一次比较,这个过程可省略,因为它在上一轮结束后,已经是比右边的小了
  19. if (a[j] > a[j + 1]) {
  20. t = a[j];
  21. a[j] = a[j + 1];
  22. a[j + 1] = t;
  23. }
  24. }
  25. }
  26. printf("排序之后为:");
  27. for (j = 0; j < n; j++)
  28. printf("%-3d", a[j]);
  29. return 0;
  30. }

 运行结果为:


 再来看交换法:


交换法排序: 交换法排序:

      第一轮a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
        第二轮a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
循环,外循环变量i从0循环到N-2,共循环N-1次;内循环变量j从i+1开始循环到N-1 

 代码如下:

  1. /*交换法排序:第一轮用a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
  2. 第二轮用a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
  3. 循环,外循环变量i从0循环到8,共循环9次;内循环变量j从i+1开始循环到N-1*/
  4. //从键盘输入10个数,按照升序排序,并输出排序结果。
  5. #include<stdio.h>
  6. int main() {
  7. int n;
  8. int i, j, t, a[100];
  9. printf("请输入要排序的元素个数:");
  10. scanf("%d", &n);
  11. printf("请输入要排序的元素:");
  12. for (j = 0; j < n; j++) {
  13. scanf("%d", &a[j]);
  14. }
  15. /*核心部分:i属于[0,n-1);j属于[i+1,n)*/
  16. for (i = 0; i < n-1; i++) {
  17. for (j = i + 1; j < n; j++) {
  18. if (a[i] > a[j]) {
  19. t = a[i];
  20. a[i] = a[j];
  21. a[j] = t;
  22. }
  23. }
  24. }
  25. printf("排序后为:");
  26. for (j = 0; j < n; j++) {
  27. printf("%-2d", a[j]);
  28. }
  29. return 0;
  30. }

 运行结果为:

 

选择法排序:(选择法排序是交换法排序的改进版,两个核心循环没有发生变化)

        是交换法排序的改进方法,在交换法中,用于排序的双重循环中,每当a[i]>a[j]时,就交换a[i],a[j],
        实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需要在本轮比较结束后,交换a[i],a[k]即可。

  1. /*选择法排序*/
  2. #include<stdio.h>
  3. int main() {
  4. int i, j, t, k, a[100];
  5. int n;
  6. printf("请输入要排序的元素个数:");
  7. scanf("%d", &n);
  8. printf("请输入要排序的元素:");
  9. for (i = 0; i < n; i++) {
  10. scanf("%d", &a[i]);
  11. }
  12. /*核心*/
  13. for (i = 0; i < n - 1; i++) {
  14. k = i;
  15. for (j = i + 1; j < n; j++) {
  16. if (a[k] > a[j]) {
  17. k = j;
  18. }
  19. }if (i != k) { //即a[i]不是最小的,(已经执行过k=j;)将a[i]与后面最小的元素换位置
  20. t = a[i];
  21. a[i] = a[k];
  22. a[k] = t;
  23. }
  24. }printf("排序后的数组为:");
  25. for (i = 0; i < n; i++) {
  26. printf("%-3d", a[i]);
  27. }
  28. return 0;
  29. }//这种方法比交换法更简便,交换次数更少

 以上就是最基本的:三种排序

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码艺术创作者/article/detail/63009
推荐阅读
相关标签
  

闽ICP备14008679号