我的视频课:《面试之排序算法》欢迎大家围观~
核心思想
第 i 趟排序对序列的前 n-i+1个元素从第一个元素开始依次作如下操作:相邻的两个元素比较大小,若前者大于后者,则两个元素交换位置,否则不交换位置。
冒泡排序的特点是该n-i+1个元素中最大值元素移到该n-i+1个元素的最后,整体效果就是值大的元素往后沉,值小的元素往前浮
冒泡排序的完整过程图示如下:
我们发现只经过了4趟比较就得出了最后的结果,针对这一情况作出如下优化:
每一趟趟排序前置flag为0,排序过程中出现元素交换动作,置flag为1;
若某趟排序结束后,flag依旧为0,则表示不需要交换,排序结束。
算法实现
冒泡排序的C语言实现如下:
#include <stdio.h>
//打印输出数组
void print_arr(int arr[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%5d",arr[i]);
}
printf("\n");
}
/**改进后的冒泡排序
**共进行i趟(从0开始),每一趟从第0个数开始,共进行len-i-1次比较,如果前面的数大于后面的数,则交换;
**每一趟排序都可以确定一个未排序数据中的最大值放到最后;
**如果一趟没有交换数据,则排序结束;
**/
void bubble_sort(int arr[],int len)
{
int i,j,temp;
int flag = 1;
for(i=0;i<len;i++)
{
printf("the %d trip:\n",i+1);
flag = 0;
for(j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
}
print_arr(arr,len);
if(!flag)
break;
}
}
int main() {
int arr[] = { 49,97,38,13,27,50,76,65};
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
printf("\n\n\nthe result is:\n");
print_arr(arr,len);
return 0;
}
程序运行结果如下:
算法分析
泡排序法的排序趟数与原始序列中数据元素的排列有关,因此,排序的趟数为一个范围,即[1…n-1]。
冒泡排序算法的时间复杂度为O(n2);
冒泡排序方法比较适合于参加排序的序列的原始状态基本有序的情况;
冒泡排序法是稳定性排序方法;