算法分析
- 冒泡排序每次只比对相邻两个,将较大值向后放(假设升序排列)。
- 外循环规定每一轮遍历要比较的元素个数,内循环选出最大值
- 当第一轮比对结束后,则数组末尾便是最大值,因此在后续排序中不需要再参与。
- 选出最大值并放在末尾后,下一轮外循环便减少一个要比较的元素数目。
- 内循环继续比较,再次选出最大值放在末尾。
- 直到排序完成,即外循环中需要比较的元素清零。
一般实现:
//普通实现:
void Bubble_sort(int* arr, int length)
{
for (int i = length -1;i > 0;i--)
{
for (int j = 0; j < i; j++)
{
if (arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
return;
}
递归实现
void Bubble_sort_recursion(int* arr, int length)
{
if (length < 2)return;
for (int i = length; i > 0; i--)
{
for (int j = 0;j < i;j++)
{
int tmp=arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
Bubble_sort_recursion(arr, length--);
return;
}
测试
int main()
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
Bubble_sort(arr, 15);
for (size_t i = 0; i < 15; i++)std::cout << arr[i] << '\t';
int arr1[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
Bubble_sort_recursion(arr1, 15);//可能存在栈溢出的情况
for (size_t i = 0; i < 15; i++)std::cout << arr[i] << '\t';
std::cout << std::endl;
return 0;
}
分析:
时间复杂度:O(n^2) (完成两成循环的耗时)
空间复杂度:O(1)(只需要一个int类型存储临时交换变量)
优化
随着排序进行,随着两两排序的进行,未排序数字的有序度越来越高,可以记录某一轮比较是否有交换位置的行为发生,根据记录 当某一轮比对不再有交换发生则停止整个排序。以此达到时间优化的目的。
我觉的这个优化很鸡肋,一般涉及到很大的数据量的时候,不需要进行全部排序,而数据量小的时候,这点优化带来的效率的提升没啥意义。摆弄学识的手段罢了