冒泡排序

xiaoxiao2021-02-27  165

简要步骤

冒泡排序通过相邻数据的比较寻找较优值,若与要求的顺序相反则交换位置。

初始序列:{ 4, 6, 3, 0, 2, 5, 1 }

图解说明中只画出了第一轮冒泡情况,也就是i = 0的情况。我们可以发现,每一轮冒泡就是通过相邻数据的比较,把较小值逐渐往上推。第一轮将第一小的值放在i = 0的位置,第二轮将第二小的值放在i = 1的位置,依次类推获得最终排序结果。

性能分析

时间复杂度:冒泡排序的平均时间复杂度为O( N^2 ),当数据正序时,时间复杂度为最优值O( N ),但是当数据反序时,时间复杂度为最差值O( N^2 )。

空间复杂度:在相邻数据交换时,需要额外一个辅助空间,空间复杂度为O( 1 )。

稳定性:冒泡排序只会交换相邻数据,相同数据的前后顺序并不会改变,所以是稳定的。

优化

冒泡排序的常见优化方法是:设立一个标记,用来显示每一轮冒泡中是否有进行数据交换。如果当某一轮冒泡中没有数据交换,那么就会直接跳出循环,避免多余的比较。

代码

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> void Swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } /* * 基本冒泡排序 */ void BubbleSort1(int arr[], int length) { if(arr == NULL || length < 0) { printf("\n输入错误!"); exit(-1); } for (int i = 0; i < length; i++) for (int j = length - 1; j > i; j--) if (arr[j - 1] > arr[j]) Swap(&arr[j - 1], &arr[j]); } /* * 优化冒泡排序 */ void BubbleSort2(int arr[], int length) { bool flag = false; if(arr == NULL || length < 0) { printf("\n输入错误!"); exit(-1); } for (int i = 0; i < length; i++) { flag = false; for (int j = length - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { Swap(&arr[j - 1], &arr[j]); flag = true; } } if(!flag) { break; } } } int main() { int arr[] = {4,6,3,0,2,5,1}; int length = sizeof(arr)/sizeof(arr[0]); printf("排序前:"); for(int i=0; i<length; i++) { printf(" %d",arr[i]); } BubbleSort1(arr, length); printf("\n排序后:"); for(int i=0; i<length; i++) { printf(" %d",arr[i]); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-15185.html

最新回复(0)