算法原理:通过不断对比相邻两个元素之间的大小关系,将大的元素向后移动
时间复杂度:O(n^2)
c++实现对整形数组排序
1 void bubbleSort(int arr[],int n) 2 { 3 for(int i=1;i<n;i++) 4 for(int j=1;j<n-i;j++) 5 if(arr[j-1]>arr[j]) 6 swap(arr[j-1],arr[j]); 7 return; 8 }
或者,因为每次循环可以得到当前循环最大的元素并放在数组最后,所以可以通过将最后一次交换的位置赋值给数组长度,获得下次循环的限定条件
1 void bubbleSort(int arr[],int n) 2 { 3 bool swapped; 4 int newn; 5 6 do{ 7 swapped=false; 8 newn=0; 9 for(int i=1;i<n;i++) 10 { 11 if(arr[i-1]>arr[i]) 12 { 13 swap(arr[i-1],arr[i]); 14 swapped=true; 15 newn=i; 16 } 17 } 18 n=newn; 19 }while(swapped); 20 return; 21 }
经过简化,将newn赋值简化为n--
1 void bubbleSort(int arr[],int n) 2 { 3 bool swapped; 4 5 do{ 6 swapped=false; 7 for(int i=1;i<n;i++) 8 { 9 if(arr[i-1]>arr[i]) 10 { 11 swap(arr[i-1],arr[i]); 12 swapped=true; 13 } 14 } 15 n--; 16 }while(swapped); 17 return; 18 }
三种排序在对随机数排序时,第二种排序时间最长,第三种比第一种时间稍长。
在对接近有序的数组排序时,越接近有序,第一种变化比较小,第二种和第三种排序速度越快,第二种比第三种变化大,在只有个别元素无序时,第二种最快