关于冒泡排序,我就记住两点:1. 需要双层循环,循环下标要搞对;2. 大的元素要“沉底”或者小的元素要“浮上来”(按照从小到大排列),都行。
刚刚自己写了一遍,发现:(1)其实1和2是相联系的,就是说内层循环遍历的方向、外层循环下标移动方向,与是“沉底”还是“浮上来”有关;(2)排序最终结果的排列方向(从小到大或者从大到小)与当前比较的比较条件有关。
这段代码写的是:内层循环从上到下正向遍历,大元素沉底,外层循环下标(表示循环的覆盖范围)逐渐上移。代码如下:
void BubbleSort (int Array[], int iNum) // iNum是数组Array的元素数目
{
if (iNum <= 1) // 防御性代码
return;
for (int i=0; i<iNum-1; i++) // 外层循环,控制内层循环的遍历范围。随着内层循环每次遍历,外层循环自下向上逐渐缩小范围(最大的元素都沉底了,就不用遍历比较了)
for (int j=0; j<iNum-i-1; j++) // 内层循环,控制遍历方向。这里是从上到下遍历,结合下面if条件判断,使得每次遍历,最大的元素“沉底”;如果这个遍历的方向是从下到上,且下面if条件不变,则每次遍历的结果是使得最小的元素“冒泡”
{
if (Array[j] > Array[j+1]) // 控制排序结果的“方向”:数组上面是数值小的元素,下面是数值大的元素
{
int iTemp = Array[j];
Array[j] = Array[j+1];
Array[j+1] = iTemp;
}
}
}
这个考虑的不如快速排序时间那么久,可能还有可以改进或者商榷的地方。暂时就写这么多吧。