您的位置:首页 > 其它

冒泡排序原理以及算法

2012-04-06 11:52 155 查看
冒泡排序的主要思路:
我们把要排序的数组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交换的结构。后面也一样。

C++源码:
#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;
}
我这里用了一个哨兵做标记,就是如果在已经是排好序的情况下我们能检测出来并退出。随便说一下,冒泡排序是稳定的排序。

Java源码
public class BubbleSort
4{
5
6
7    public static void main(String[] args){
8        int[] values ={
9                3,1,6,2,9,0,7,4,5
10        };
11
12        sort(values);
13        for(int i=0; i < values.length; ++i){
14
15            System.out.println("Index: " + i + "Value: " + values[i]);
16
17        }
18
19
20    }
21
22
23    public static void sort(int[]  values){
24
25
26        int temp;
27
28        for(int i=0 ; i < values.length ; ++i){
29
30            for(int j=0; j <values.length - i - 1; ++j){
31
32                if(values[j] > values[j + 1]){
33                    temp = values[j];
34                    values[j] = values[j + 1];
35                    values[j + 1] = temp;
36
37
38
39                }
40
41
42
43            }
44
45
46        }
47    }
48
49}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: