1、冒泡排序的概念网上一大堆,这里也就不复制了。下面主要是我的一些理解,算是在此做个笔记吧!
注:排序算法系列文章,采用VS2010编写示例代码
2、“冒泡”是一个很形象的比喻,下面先看一段简单的代码:
int nNum[] = {1, 3, 8, 5, 7, 6, 9, 2, 0, 8};
int nCount = sizeof (nNum) / sizeof (nNum[0]);
int nMax = nNum[0];
for ( int i = 1; i < nCount; i++)
{
nMax = nMax > nNum[i] ? nMax : nNum[i];
}
|
这段代码很简单,运行的结果是找出一组数中的最大值,执行完后nMax应该等于9;
3、根据上述代码,那么要实现排序,即将一组数由大到小(降序)排列或是由小到大(升序)排列,只要重复上述代码就可以了。具体如下(以找出大值为例):
(1)从一组数中找出最大的数,并保存,执行步骤(2);
(2)将(1)中找出的数从这组数中剔除,执行步骤(3);
(3)判断这组数的个数是否小于2,若否,则执行(1),若是,则确定大小完成,执行(4);
(4)根据要求(升序还是降序)给出结果;
注意:如果待排序数原有n个,那么找出最大值的操作要执行n-1次;
4、上述逻辑算法有了,但是在实现(2)的时候遇到了问题,如何真正移除一个数组中的元素?这个问题显然不是一两句话能说清楚的,这里就换一种实现方式:为了简便,将待排序数放入vector中。
5、实现代码如下(貌似有点绕):
// Bubble_Sort_Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
int _tmain( int argc, _TCHAR* argv[])
{
// 待排序的数
int nNum[] = {1, 3, 8, 5, 7, 6, 9, 2, 0, 8};
// 待排序数的个数
const int nCount = sizeof (nNum) / sizeof (nNum[0]);
// 用vector保存待排序数
vector < int > vectorNum;
for ( int i = 0; i < nCount; i++)
{
vectorNum.push_back( nNum[i] );
}
// 用于保存排序结果
int nSort[nCount] = {-1};
// 排序
for ( int i = 0; i < nCount - 1; i++) // nCount个数,需要求最大值nCount-1次
{
int nMax = vectorNum[0];
int nPos = 0;
// 求最大值
for (unsigned int j = 1; j < vectorNum.size(); j++)
{
nMax = nMax > vectorNum[j] ? nMax : vectorNum[j];
nPos = nMax == vectorNum[j] ? j : nPos; // 保存最大值在vector中的位置,以便删除
}
nSort[i] = nMax; // 保存
vectorNum.erase(vectorNum.begin() + nPos); // 剔除最大值
}
// 最后一个数的操作
nSort[nCount - 1] = *vectorNum.begin();
vectorNum.clear();
// 打印
for ( int i = 0; i < nCount; i++)
{
cout << nSort[i] << endl;
}
getchar ();
return 0;
}
|
6、上述过程略显复杂,但是思路却是冒泡算法的基础,实际上冒泡算法也是这样一次一次求最大值,只不过这个求的过程中有一个巧妙的地方:它把一趟求最大值的过程,实现为一趟两两交换的过程,最大值自然地被换到了数组的末尾。以{1, 3, 8, 5, 7, 6, 9, 2, 0, 8}为例:
通过以上9次大小比较,进而交换位置,最后将最大值放到的末尾。
7、根据上述示例,可以这样实现一个排序算法:
(1)从一组数中找出最大的数:通过交换位置,将其放到末尾(这一过程就是冒一次泡),执行步骤(2);
(2)将这组数的个数减1,执行步骤(3);
(3)若冒泡次数小于待排序数的个数减1,执行(1);否则,排序完成。
注意:如果待排序数原有n个,那么要冒泡n-1次;而如果每次冒泡需要交换数据的个数为m,则需要交换m-1次。
8、实现代码:
int _tmain( int argc, _TCHAR* argv[])
{
// 待排序的数
int nNum[] = {1, 3, 8, 5, 7, 6, 9, 2, 0, 8};
// 待排序数的个数
const int nCount = sizeof (nNum) / sizeof (nNum[0]);
// 冒泡排序
for ( int i = 0; i < nCount - 1; i++) // nCount个数,冒泡nCount-1次
{
for ( int j = 0; j < nCount - 1 - i; j++) // i等于几就表示最后i个数已经确定了,对nCount-1-i个数进行交换,找出最大值
{
if (nNum[j] > nNum[j + 1]) // 大的放到后面
{
int nTemp = nNum[j + 1];
nNum[j + 1] = nNum[j];
nNum[j] = nTemp;
}
cout << nNum[j];
}
cout << endl;
}
// 输出结果
for ( int i = 0; i < nCount; i++)
{
cout << nNum[i];
}
getchar ();
return 0;
}
|