冒泡排序原理以及算法
2012-04-06 11:52
155 查看
冒泡排序的主要思路:
我们把要排序的数组A = {3,4,2,1} 看成一组水泡, <!--[endif]-->就像冒泡一样,轻的在上面,重的在下面,换成数据,就是小的在上面,大的在下面。 我们先把最轻的冒出到顶端,然后冒出第二轻的在最轻的下面,接着冒出第三轻的。依次内推。直到所有都冒出来了为止。
3.我们怎么做到把最轻的放在顶端呢?我们从最底下的数据开始冒,如果比他上面的数据小,就交换(冒上去),然后再用第二第下的数据比较(此时他已经是较轻的一个),如果他比他上面的小,则交换,把小的冒上去。直到比到第一位置,得到的就是最轻的数据咯,这个过程就像是冒泡一样,下面的和上面的比较,小的冒上去。大的沉下来。呵呵。
画个图先:
开始: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++源码:
Java源码
我们把要排序的数组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 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}
相关文章推荐
- 交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现
- 冒泡排序原理以及算法
- 冒泡排序原理以及算法
- 完整的冒泡排序实现以及原理
- Base64 算法原理,以及编码、解码【加密、解密】 介绍
- 顺序表创建以及查找排序算法(含有顺序查找算法、带哨兵站顺序查找、折半查找算法、冒泡排序)的C++实现在vs2013环境下实现
- PHP:冒泡排序、快速查找和二分查找的思路以及算法
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- 聚类方法:DBSCAN算法研究(1)--DBSCAN原理、流程、参数设置、优缺点以及算法
- GBDT算法原理以及实例理解
- 自编码器原理以及相关算法 Basic Auto-Encoder,Regularized Auto-Encoder,Denoising Auto-Encoder
- 路由表生成算法以及收敛路由原理
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- PCA原理以及算法实现
- MD5的简介以及实现其算法原理的各种语言的代码
- 关于韩信点兵的算法以及原理
- Adaboost原理、算法以及应用
- 数据结构 求链表的长度以及用冒泡排序的算法对链表中的值进行排序
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- CART算法的原理以及实现