1 #include<iostream> 2 #include<iomanip> 3 #include<time.h> 4 using namespace std; 5 const int N=10; 6 7 void BubbleSort(int arr[], int n) 8 { 9 int i, j, t; 10 for(i=0;i<n-1;i++) 11 { 12 for(j=0;j<n-i-1;j++) 13 { 14 if(arr[j]>arr[j+1]) 15 { 16 t=arr[j+1]; 17 arr[j+1]=arr[j]; 18 arr[j]=t; 19 } 20 } 21 } 22 } 23 24 int main() 25 { 26 int a[N], i; 27 srand(time(NULL)); 28 for(i=0;i<N;i++) 29 a[i]=rand()%100; 30 for(i=0;i<N;i++) 31 cout<<setw(4)<<a[i]; 32 cout<<endl; 33 34 BubbleSort(a,N); 35 for(i=0;i<N;i++) 36 cout<<setw(4)<<a[i]; 37 cout<<endl; 38 }
#include<stdio.h> #include<stdlib.h> #include<time.h> #define N 10 void BubbleSort(int arr[], int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { t=arr[j+1]; arr[j+1]=arr[j]; arr[j]=t; } } } } int main() { int a[N], i; srand(time(NULL)); for(i=0;i<N;i++) a[i]=rand()%100; for(i=0;i<N;i++) printf("%3d", a[i]); printf("\n"); BubbleSort(a,N); for(i=0;i<N;i++) printf("%3d", a[i]); printf("\n"); return 0; }
算法原理
冒泡排序算法的运作如下:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。
所需的关键字比较次数
和记录移动次数
均达到最小值:
,
。
所以,冒泡排序最好的时间复杂度为
若初始文件是反序的,需要进行
。
若初始文件是反序的,需要进行
趟排序。每趟排序要进行
次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为
。
综上,因此冒泡排序总的平均时间复杂度为
。
算法的稳定性
冒泡排序是就地排序,且它是稳定的。
来源:https://www.cnblogs.com/Lee-geeker/archive/2013/06/07/3125012.html