5.5.1 数组排序
【 例 5-4 】编写程序,在数组中保存 1~100 的 10 个随机整数,对数组进行升序排序,并将排序后的数组元素打印输出。
根据要求,我们首先定义一个长度为 10 的 int 类型数组 arr,然后通过循环结构 for 语句和 rand 函数来获取 10 个 1~100 的随机整数,并其保存至数组 arr 中。注意,为了得到真正的随机数,我们在 rand 函数之前使用 srand 函数来设置随机数种子。
对于数组元素的排序,我们采用最经典的“冒泡”排序算法,该算法比较简单,并且适合小规模的数组数据排序工作。为了让大家对“冒泡”排序算法有更直观的理解,下面使用一个固定的 5 个整数的待排序序列,作为案例进行演示。
待排序序列为:5、3、7、4、–1。
冒泡排序的升序算法思路为:共进行“元素个数–1”轮的比较过程,每一轮比较过程完成后,都会将当前待排序序列中最大的那个元素移动至最后位置,然后,将这个最后位置的元素排除至待排序序列之外,将剩下的元素组成一个新的待排序序列,并参加下一轮次的比较过程。如此反复,直至所有轮执行完毕,排序工作完成。
下面,再来介绍一下每轮的比较过程:
在待排序序列中,从第一个元素起,让其和第二个元素进行比较,如果第一个元素的值大于第二个元素的值,就让第一个元素和第二个元素进行值的互换。如果第一个元素的值小于等于第二个元素的值,就不做任何操作,继续让第二个元素和第三个元素再进行比较,直至最后位置元素之前的元素和最后位置元素比较完成之后,最后位置元素就是待排序序列中最大的那个。
由于初始待排序序列中有 5 个元素,所以需要进行 4 轮的比较过程才能完成排序工作。图 5.8 展示了每一轮比较过程之后,整个序列的变化情况。
图 5.8 冒泡排序过程
第一轮待排序序列中有 5 个元素,比较过程完成后,值为 7 的元素被移至最后位置,并被排除在待排序序列之外,进入完成序列。
第二轮待排序序列中有 4 个元素,比较过程完成后,值为 5 的元素被移至最后位置,并被排除在待排序序列之外,进入完成序列。
第三轮待排序序列中有 3 个元素,比较过程完成后,值为 4 的元素被移至最后位置,并被排除在待排序序列之外,进入完成序列。
第四轮待排序序列中有 2 个元素,比较过程完成后,值为 3 的元素被移至最后位置,并被排除在待排序序列之外,进入完成序列。
由于待排序序列中只剩一个元素,无须再进行比较,整个排序结束。
从图中可以清晰地看到,值比较大的元素不断下沉,而值小的元素不断上浮,就像鱼儿在水中吐泡泡一样,因此,该排序算法被称为“冒泡”排序算法。
理解了冒泡排序算法后,就可以用它来完成任务了。下面将对数组进行冒泡排序的工作封装成一个函数,函数名为 bubble,该函数无返回值,并带有两个参数:第一个是数组类型的参数 a,用于指定数组的内存位置;第二个是 int 类型的参数 len,用于指示数组的长度。
整个程序的代码如下:
程序运行结果如下:
12 21 53 56 57 74 76 79 81 90
由于程序中使用的是随机值,所以读者在测试的时候,打印输出的结果与本书不一致是正常的。但是,打印输出的结果必须是按升序排列的,这才能达到程序要求,否则程序就是有问题的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论