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}为例:

排序算法(一)冒泡排序算法1_待排序

通过以上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;      


       }


排序算法(一)冒泡排序算法1_排序算法_02