程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。排序是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。对数据进行排序是最重要的应用之一。实际生活中的很多问题都需要对数据进行排序。今天我们就来介绍一种最简单的排序法:交换法排序。
交换法排序借鉴了求最大、最小值的思路。以降序排列为例,其排序的基本过程为:首先进行第一轮比较,参与比较的数有n个,将第一个数分别与后面所有的数进行比较,若后面的数较大,则交换后面这个数和第一个数的位置;
如上表中,第一个数为84,84和83比较,84>83,进行下一次循环;84<88,将84与88互换位置,于是变成:
之后第一个数变为88,进行下一次循环;由于后面的数都比88小,故第一轮比较结束。
这一轮比较结束以后,就求出了一个最大的数放在了第一个数的位置。然后进入第二轮比较,参与比较的数变为n-1个,在这n-1个数中再按上述方法求出一个最大的数放在第二个数的位置。
如上表中,第二个数为83,83和84比较,83<84,将83与84互换位置,于是变成:
之后第二个数变为84,进行下一次循环,与87进行比较,而84<87,故将84与87互换位置,变为:
此时第二个数变为87,下一轮循环中87>61,不改变,故第二轮比较结束。
然后进入第三轮比较……依此类推,直到第n-1轮比较,参与比较的数变为2个,求出一个最大的数放在第n-1个数的位置,剩下的最后一个数自然就为最小的数,放在数列的最后。
n个数总共需要n-1轮比较,由于每一轮比较都新排出一个数,因此每一轮余下的待比较的数都相对于上一轮减少了一个。按交换法进行降序排序的程序如下:
int array[n] = {...};//假设n是常量
for (int i = 0; i < n-1; i++)
{
for (int j = i+1; j < n; j++)
{
if (array[j] > array[i])
{
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
若进行升序排序,只需把if中的语句改为array[j] < array[i]即可。
整个算法的核心,其实就是使用循环遍历整个数组,使每个值一一进行比较,进而找出它们之间的相互大小关系。但由于这种方法过于冗杂,效率不高,因此较少使用。
参考文献:
苏小红 赵玲玲 孙志岗 王宇颖 等编著 蒋宗礼 主审. 高等教育出版社. C语言程序设计(第4版)
|