项目 4-1 对数组进行排序
一维数组以基于索引的线性列表来组织其中的数据,这是一种很好的可用于排序的数据结构。在这个项目中,我们将学习一种简单的对数组进行排序的方法。或许你已经知道有多种不同的排序算法。快速排序,筛选排序和希尔排序只是其中的三种。然而,最有名的,也是最简单、最容易理解的排序算法叫做冒泡排序。实际上,冒泡排序算法并不是十分的高效。当使用大数组的时候,它的性能是不可接受的。但是针对小数组来讲,我们倒是可以使用这种排序算法。
步骤:
1. 创建一个文件,命名为Bubble.cpp
2. 冒泡排序的名字得于这种算法的排序操作。这种算法使用反复的比较,根据比较的结果,交换数组中相邻的元素。在整个过程中,小的数值向数组的一端移动,大的数值向数组的另一端移动。这个过程就像是水槽中的气泡一样。冒泡排序通过多次遍历数组,必要的时候交换乱序的元素来达到排序的目的。为了确保数组中的元素最终是有序,需要遍历数组的次数要等于或者小于数组中元素的数量。
下面是一段进行冒泡排序的代码。被排序的数组叫做nums。
//使用冒泡排序
for ( a = 1; a < size ; a++ )
{
for ( b = size - 1; b >= a; b-- )
{
if ( nums[b-1] > nums[b] ) //如果乱序,则交换元素
{
t = nums[b-1];
nums[b-1] = nums[b];
nums[b] = t;
}
}
}
排序使用了两个循环,内部的循环对数组中相邻的两个元素进行检查,查找出乱序的元素,然后交换之。每次这样遍历一遍数组,最小的元素就被移动到了正确的位置。外部的循环保证了这种检查交换的过程一直进行直到整个数组中的元素都被正确排序了。
3. 下面是完整的Bubble.cpp的程序:
/*
项目 4-1
演示冒泡排序
*/
#include <iostream>
#include <cstdlib>
using namespace std;
int main ( )
{
int nums[10];
int a,b,t;
int size;
size = 10; //需要排序的元素的数量
//用随机的数值来初始化数组
for ( t = 0; t < size; t++ )
{
nums[t] = rand();
}
//显示排序前的原始的数值
cout << "Original array is :\n";
for ( t= 0; t < size; t++ )
{
cout << nums[t] << ' ';
}
cout << '\n';
//使用冒泡排序
for ( a = 1; a < size ; a++ )
{
for ( b = size - 1; b >= a; b-- )
{
if ( nums[b-1] > nums[b] ) //如果乱序,则交换元素
{
t = nums[b-1];
nums[b-1] = nums[b];
nums[b] = t;
}
}
}
//显示出排序后的数组
cout << "\nSorted array is:\n";
for ( t = 0; t < size ; t++ )
{
cout << nums[t] << ' ';
}
return 0;
}
程序的输出结果如下:
Original array is :
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709
Sorted array is:
16807 101027544 282475249 470211272 984943658 1144108930 1457850878 1458777923 1622650073 2007237709
尽管冒泡排序对于小的数组很有效,但是对于大数组则效率很低下。最好的通用的排序算法是快速排序。但是由于快速排序中使用到了我们还没有学习的C++特性。还有,C++标准库中已经包含了函数qsort()来实现快速排序。为了使用这个函数,我们还需要学习更多的C++知识。