随感而发

杂七杂八

统计

留言簿(13)

阅读排行榜

评论排行榜

冒泡排序

今天学习了冒泡排序,我开始还纳闷怎么书上没有冒泡排序!结果是我的看书不认真,给漏掉了,这次补上。呵呵。

冒泡排序的主要思路:

我们把要排序的数组A = {3,4,2,1} 看成一组水泡, <!--[endif]-->就像冒泡一样,轻的在上面,重的在下面,换成数据,就是小的在上面,大的在下面。 我们先把最轻的冒出到顶端,然后冒出第二轻的在最轻的下面,接着冒出第三轻的。依次内推。直到所有都冒出来了为止。
3.我们怎么做到把最轻的放在顶端呢?我们从最底下的数据开始冒,如果比他上面的数据小,就交换(冒上去),然后再用第二第下的数据比较(此时他已经是较轻的一个),如果他比他上面的小,则交换,把小的冒上去。直到比到第一位置,得到的就是最轻的数据咯,这个过程就像是冒泡一样,下面的和上面的比较,小的冒上去。大的沉下来。呵呵。

画个图先:

最初

第一次结果

第二次结果

第三次结果

3

3

3

1

4

4

1

3

2

1

4

4

1

2

2

2

开始:1 和2 比,1比2小,浮上,然后1跟4比,再1跟3比,这样结构就变为1,3,4,2。最小的位置确定了,然后我们确定第二小的,同理2 vs 4, 2 vs 3 得到2, 再确定第3小数据,3 vs 4得到3,最后就是4为最大的数据,我们冒泡就排好了。

注:这里红色的1,2是前一次比较1 vs 2交换的结构。后面也一样。

大概思路就这样了,奉上源代码:

 

#include <stdio.h>
#include 
<stdlib.h>

//冒泡排序, pnData要排序的数据, nLen数据的个数
int BubbleSort(int* pnData, int nLen)
{
    
bool isOk = false;        //设置排序是否结束的哨兵

    
//i从[0,nLen-1)开始冒泡,确定第i个元素
    for (int i = 0; i < nLen - 1 && !isOk; ++i)
    {
        isOk 
= true;        //假定排序成功

        
//从[nLen - 1, i)检查是否比上面一个小,把小的冒泡浮上去
        for (int j = nLen- 1; j > i; --j)
        {
            
if (pnData[j] < pnData[j - 1])    //如果下面的比上面小,交换
            {
                
int nTemp = pnData[j];
                pnData[j] 
= pnData[j - 1];
                pnData[j 
- 1= nTemp;
                isOk 
= false;
            }
        }
    }

    
return 1;
}

int main()
{
    
int nData[10= {4,10,9,8,7,6,5,4,3,2};    //创建10个数据,测试
    BubbleSort(nData, 10);        //调用冒泡排序

    
for (int i = 0; i < 10++i)        
    {
        printf(
"%d ", nData[i]);
    }

    printf(
"\n");
    system(
"pause");
    
return 0;
}
 我这里用了一个哨兵做标记,就是如果在已经是排好序的情况下我们能检测出来并退出。随便说一下,冒泡排序是稳定的排序。

 


posted on 2009-04-25 15:00 shongbee2 阅读(9252) 评论(2)  编辑 收藏 引用 所属分类: 数据结构和算法

评论

# re: 冒泡排序 2011-11-10 10:19 davey

哨兵isOk 没用上  回复  更多评论   

# re: 冒泡排序 2012-09-06 15:01 ke

@davey
for (int i = 0; i < nLen - 1 && !isOk; ++i)这里不是用哨兵检测数组是否已经有序吗?有序的话就不会继续循环,直接退出。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理