VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 494|回复: 5

[求助] 选择法排序和冒泡法排序问题。

[复制链接]
07_avatar_middle
在线会员 Acher陈 发表于 2018-2-6 22:47:52 | 显示全部楼层 |阅读模式
3驿站币
冒泡法排序:就是每一趟把值最大的那个数往后移动,经过n趟后就排序完成。
但是选择法排序我就是没有搞懂是怎么操作的,没有搞清楚原理。
下面这个c程序是运用的选择法来将一个包含 十个 数的数组进行排序。函数sort中间的for循环就是没有搞懂是什么意思。特别是k=i;k=j;没有搞懂为什么要这么定义。


  1. #include <stdio.h>
  2. int main()
  3. {
  4.         void sort(int array[], int n);
  5.         int a[10], i;
  6.         printf("enter array:\n");

  7.         for (i = 0; i < 10; i++)
  8.                 scanf("%d", &a[i]);
  9.         sort(a, 10);

  10.         printf("The sorted array:\n");
  11.         for (i = 0; i < 10; i++)
  12.                 printf("%d ", a[i]);

  13.         printf("\n");
  14.         return 0;
  15. }

  16. void sort(int array[], int n)
  17. {
  18.         int i, j, k, t;
  19.         for (i = 0; i < n - 1; i++)
  20.         {
  21.                 k = i;
  22.                 for (j = i + 1; j < n; j++)
  23.                         if (array[j] < array[k])
  24.                                 k = j;
  25.                 t = array[k]; array[k] = array[i]; array[i] = t;
  26.         }
  27. }

复制代码


输出结果如下:

选择法排序和冒泡法排序问题。

最佳答案

查看完整内容

简单选择排序的基本思想: 第1趟,在待排序记录 r[1]~r[n] 中选出最小的记录,将它与 r[1] 交换; 第2趟,在待排序记录 r[2]~r[n] 中选出最小的记录,将它与 r[2] 交换; 以此类推,第 x 趟在待排序记录 r[x]~r[n] 中选出最小的记录,将它与 r[x] 交换,使有序序列不断增长直到全部排序完毕。 以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列: 初始序列:{ 49 27 65 97 76 12 38 } 第1趟 ...




上一篇:驱动如何自动安装
下一篇:客户端是个win32控制台

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

01_avatar_middle
online_admins admin 发表于 2018-2-6 22:47:53 | 显示全部楼层
简单选择排序的基本思想:

第1趟,在待排序记录 r[1]~r[n] 中选出最小的记录,将它与 r[1] 交换;
第2趟,在待排序记录 r[2]~r[n] 中选出最小的记录,将它与 r[2] 交换;
以此类推,第 x 趟在待排序记录 r[x]~r[n] 中选出最小的记录,将它与 r[x] 交换,使有序序列不断增长直到全部排序完毕。

以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:

初始序列:{ 49 27 65 97 76 12 38 }

第1趟:12与49交换:12 { 27 65 97 76 49 38 }

第2趟:27不动:12 27 { 65 97 76 49 38 }

第3趟:65与38交换:12 27 38 { 97 76 49 65 }

第4趟:97与49交换:12 27 38 49 { 76 97 65 }

第5趟:76与65交换:12 27 38 49 65 { 97 76 }

第6趟:97与76交换:12 27 38 49 65 76 97 完成!

按照这个思路咱们来理解一下代码:
第1次进入外层 for 循环,i = 0, k = i,所以 k 也等于0,对吧?之后进入内层 for 循环的第1次,j = i + 1,j 就等于1,这个 if (array[j] < array[k]) 也就是比较数组中的第1个元素和第0个元素,如果第1个元素比第0个元素小,那么就 k = j,也就是说 k = 1,也就是说k的值是相对来说小的那个数的索引。之后进入内层 for 循环的第2次,j = 2 了,所以也就是再拿之前来说数组元素0 和 元素1 较小的数与 数组元素2来比较,再次获取较小的数,并将其序号保留在变量 k 中。所以内层 for 循环走一次下来之后,变量 k 中保留的就是数组中元素的值最小的索引序号。

之后执行这么几句代码:
  1. t = array[k];
  2. array[k] = array[i];
  3. array[i] = t;
复制代码

就将最小的值跟当前 i 所指的元素互换。也就是说外层 for 循环的第1次遍历就得到了数组中的最小的元素,并将其放在了数组的第0个元素的位置,外层 for 循环的第2次遍历就将数组中第二小的数放在了数组的第1个元素的位置,以此类推。外层for循环执行完之后,就可以将整个数组按照由小到大的顺序排列了。

以上就是选择排序算法,以及对楼主代码的理解过程!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-2-7 14:48:55 | 显示全部楼层
admin 发表于 2018-2-6 23:11
简单选择排序的基本思想:

第1趟,在待排序记录 r[1]~r[n] 中选出最小的记录,将它与 r[1] 交换;


谢谢大哥。 我重新注释了一下代码。你看看我这样写有没有什么错呢?

  1. # include <stdio.h>
  2. void main()
  3. {
  4.         int a[] = { 8, 9, 7, 0, 5, 4, 3, 2, 1, 6 };
  5.         int i=0, j=0, k=0, t=0;
  6.         for (i = 0; i < 9; i++)//控制趟数
  7.         {
  8.                 k = i;
  9.                 for (j = i + 1; j < 10; j++)//每一趟把相邻元素比较的次数,每完成一趟就会减少一次比较的次数。
  10.                 {
  11.                         if (a[j] < a[k])//锁定最小元素,k的值一直为最小元素的下标。
  12.                                 k = j;//锁定数组中最小的元素的下标
  13.                 }
  14.                 t = a[k]; a[k] = a[i]; a[i] = t;//每一趟比较完成后将这次比较得到的最小的元素放在0号位上。
  15.         }

  16.         for (i = 0; i < 10; i++)//打印出排序后的数组
  17.                 printf("%d ", a[i]);

  18.         printf("\n");
  19. }
复制代码

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

01_avatar_middle
online_admins admin 发表于 2018-2-7 20:51:21 | 显示全部楼层
Acher陈 发表于 2018-2-7 14:48
谢谢大哥。 我重新注释了一下代码。你看看我这样写有没有什么错呢?

  1. t = a[k]; a[k] = a[i]; a[i] = t;//每一趟比较完成后将这次比较得到的最小的元素放在0号位上。
复制代码

这句话说的有点问题,每一趟比较完不一定是放在0号位,是依次往下排的,别的注释没什么问题

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-2-7 23:48:45 | 显示全部楼层
admin 发表于 2018-2-7 20:51
这句话说的有点问题,每一趟比较完不一定是放在0号位,是依次往下排的,别的注释没什么问题

哦,对的 对的。谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-20 13:38

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表