算法学习笔记「双向冒泡排序(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;
}

posted @ 2021-03-02 12:15  VanGy  阅读(381)  评论(0编辑  收藏  举报