冒泡排序
2016-04-15 19:08
225 查看
冒泡排序(Bubble Sort): 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。是一种稳定和不需要额外空间的排序算法
算法原理
1. 比较相邻的元素,如果第一个比第二个大,就交换,最后一个就是最大的元素;
2. 对剩余的n-1个元素重复1的步骤,又把第二大冒的倒数第二的位置,以此类推。
算法分析
3. 时间复杂度
冒泡排序最好的时间复杂度为O(n);最差是O(n^2); 综上,因此冒泡排序总的平均时间复杂度为 O(n^2);
4. 算法稳定性
冒泡排序是一种稳定排序算法。
算法原理
1. 比较相邻的元素,如果第一个比第二个大,就交换,最后一个就是最大的元素;
2. 对剩余的n-1个元素重复1的步骤,又把第二大冒的倒数第二的位置,以此类推。
算法分析
3. 时间复杂度
冒泡排序最好的时间复杂度为O(n);最差是O(n^2); 综上,因此冒泡排序总的平均时间复杂度为 O(n^2);
4. 算法稳定性
冒泡排序是一种稳定排序算法。
#include <stdio.h> #include <stdlib.h> void bubbleSort(int arr[],int n){//冒泡排序 int i,j,temp; for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } int main() { int n,arr ,i,j; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&arr[i]); } bubbleSort(arr,n); for(j=0;j<n;j++){ printf("%d ",arr[j]); } return 0; }
如果上面代码中,里面一层循环在某次扫描中没有执行交换,则说明此时数组已经全部有序列,无需再扫描了。因此,增加一个标记,每次发生交换,就标记,如果某次循环完没有标记,则说明已经完成排序。 #include <stdio.h> #include <stdlib.h> void bubbleSort(int arr[],int n){//冒泡排序 int i,j,temp; int sroted=0; for(i=0;i<n-1;i++){ //每次先置为true sroted=0; for(j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; sroted=1; } } // 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环 if(sroted==0){ break; } } } int main() { int n,arr ,i,j; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&arr[i]); } bubbleSort(arr,n); for(j=0;j<n;j++){ printf("%d ",arr[j]); } return 0; }
相关文章推荐
- 冒泡排序
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- C++实现对输入数字组进行排序
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总