[C语言] 交换排序之冒泡排序的特性及实现
[C语言] 交换排序之冒泡排序的特性及实现
1、算法特性
冒泡排序是一种简单、稳定的交换排序方法,属于最为基础的排序方法之一。
其时间复杂度最好情况为O(n)、最差与平均情况为O(n²),空间复杂度为O(1)。
2、算法思路
以升序排序为例,比较两个相邻的数,当后者大于前者时,二者交换;当后者小于等于前者时,继续检索。每交换一轮都能将未排序序列中的最大值交换至未排序序列尾,成为已排序序列头。同时每一轮交换结束后下一轮比较次数-1,当比较次数为0时排序完成。
3、实现代码
1 #include <stdio.h> 2 #include <stdbool.h> 3 4 // 冒泡排序:相邻两个元素进行比较,把大的放后面小的放前面,一轮完整的比较之后,最大值放在末尾 5 void bubble_sort(int arr[],int len) 6 { 7 // 第i次冒泡,把当前最大值放到arr[len-i] 8 for(int i= 0; i<len; i++) 9 { 10 bool flag = false; 11 for(int j=1; j<len-i; j++) 12 { 13 if(arr[j] < arr[j-1]) 14 { 15 int tmp = arr[j]; 16 arr[j] = arr[j-1]; 17 arr[j-1] = tmp; 18 flag = true; // 表示该次完整的循环有交换位置 19 } 20 } 21 // 所有的相邻元素都已经有序,代表整个数组有序,不需要再进行排序 22 if(flag == false) 23 { 24 break; 25 } 26 } 27 } 28 29 void travel(int arr[],int len) 30 { 31 for(int i=0;i<len;i++) 32 { 33 printf("%d ",arr[i]); 34 } 35 printf("\n"); 36 } 37 38 int main() 39 { 40 int arr[] = {53,82,9,233,43,14,55,9,4,67}; 41 int len = sizeof(arr)/sizeof(arr[0]); 42 43 travel(arr,len); 44 bubble_sort(arr,len); 45 travel(arr,len); 46 47 /* travel(arr,len); 48 quick_sort(arr,len); 49 travel(arr,len);*/ 50 51 return 0; 52 }
4、测试结果