算法学习笔记「双向冒泡排序(Cpp version)」
经典冒泡排序
冒泡排序算法是一种较为简单的并且稳定的排序算法,该算法的时间复杂度最好为\(O(n)\),最差时为\(O(n^2)\),需要的空间复杂度为\(O(1)\)。
算法稳定性:经过排序后,各元素仍然能保持它们在排序之前的相对次序,就称该算法是稳定的,反之,则为不稳定的。
// 经典的冒泡排序是选择从一端开始,通过比较相邻元素大小并交换次序的
int* BuddleSort(int arr[], int n)
{
int size = n;
for (int i = 0; i < size - 1; i++)
{
for (int j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
双向冒泡排序
对冒泡排序加以改进,从两端进行排序,也就是所谓的“双向冒泡排序”,可以有更好的效率。如果按照排序结果从小到大输出,可以按照“较大气泡从左到右移动,较小气泡从右到左移动”来实现双向冒泡排序的效果
先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。
// 双向冒泡排序
int* doubleBuddleSort(int arr[], int n)
{
int left = 0, right = n;
while (left <= right)
{
//较大气泡从左边向右边移动
for (int i = left + 1; i < right; i++)
{
if (arr[left] > arr[i])
{
int temp = arr[left];
arr[left] = arr[i];
arr[i] = temp;
}
}
left++;
//较小气泡从右边向左边移动
for (int i = right - 1; i >= left; i--)
{
if (arr[i] > arr[right])
{
int temp = arr[right];
arr[right] = arr[i];
arr[i] = temp;
}
}
right--;
}
return arr;
}