【算法导论】冒泡排序法
2013-08-01 21:00
155 查看
冒泡排序法
时间复杂度:O(n*n)基本思想:从数组最后一个元素开始,依次与前一个元素比较,若比前一个元素小,则与之交换位置,然后再与当前前一个元素比较,直到遇到比它大的元素为止。例如:假设数组为:a[5]={3,4,2,5,1};则运算过程为:首先1与5比较,由于1<5,从而交换位置,数组变为a[5]={3,4,2,1,5};然后1与当前前一个元素2比较,一直重复上述操作,经过一次循环后,数组变为a[5]={1,3,4,2,5};第二次循环从倒数第二个元素开始……,总共循环n-1次就可以得到正确结果。总的来说,首先将最小的元素放在数组前面,然后放次最小的元素,依此类推。上述过程的图解为:
3 | 4 | 2 | 5 | 1 |
3 | 4 | 2 | 1 | 5 |
3 | 4 | 1 | 2 | 5 |
3 | 1 | 4 | 2 | 5 |
1 | 3 | 4 | 2 | 5 |
具体实现如下:
#include<stdio.h> void BubbleSort(int* arrayA,int n); void main() { int arrayA[]={2,3,5,6,2,7,1,5}; int n=sizeof(arrayA)/sizeof(int); BubbleSort(arrayA,n); for(int i=0;i<n;i++) printf("%d ",arrayA[i]); } void BubbleSort(int* arrayA,int n) { for(int i=0;i<n-1;i++) { for(int j=n-1;j>i;j--)//j>i即可是因为前面的元素已经排好了 { int temp=0; if(arrayA[j]<arrayA[j-1]) { temp=arrayA[j]; arrayA[j]=arrayA[j-1]; arrayA[j-1]=temp; } } } }
注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:
#include<stdio.h>
void main()
{
int i=0;
for(int i=0;i<5;i++)
printf("%d ",i);
}
则在VC 6.0上需改为:
#include<stdio.h>
void main()
{
int i=0;
for(i=0;i<5;i++)
printf("%d ",i);
}
原文:/article/1336008.html
作者:nineheadedbird
相关文章推荐
- 【算法导论】冒泡排序法
- 算法导论——15动态规划——15.1钢条切割
- 顺序统计学(算法导论第九章)
- 【算法导论】插入排序实现
- C++ 归并排序实现(算法导论)
- 算法导论5.2 指示器随机变量
- 【算法导论之七】动态规划求解最长公共子序列
- 基数排序----算法导论
- 节点node[算法导论]二叉排序树(Binary Search Tree)
- 算法导论学习笔记-第十八章-B树
- 动态规划原理(算法导论)
- [一步一步写算法导论]合并排序
- 【算法导论】散列表
- 算法导论7.3快速排序的随机化版本
- 算法导论10.1队列
- 【算法导论】排序(一)
- 关于堆排序(参考自算法导论)
- 图的广度优先搜索----算法导论
- [算法导论]非比较排序及数据结构
- 算法导论-->约瑟夫问题