排序算法之一 冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,通过重复遍历元素并交换相邻位置的错误顺序元素来实现排序。鸡尾酒排序是冒泡排序的改进版,它从两端向中间交替进行排序,提高效率。文章详细介绍了这两种排序算法的原理和代码实现,并通过实例展示了排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

冒泡排序是一种极其简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。尽管冒泡排序是最容易了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

算法描述

1.比较相邻的元素,如果前一个比后一个大,就把它们两个对调位置。

2.对排序数组中每一对相邻元素做同样的工作,直到全部完成,此时最后的元素将会是本轮排序中最大的数。

3.对剩下的元素继续重复以上的步骤,直到没有任何一个元素需要比较。

冒泡排序代码如下:

void Swap(int arr[], int i, int j)
{
    int temp=arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

/**
* 冒泡排序
* 最差时间复杂度 O(n^2)
* 最优时间复杂度 O(n)
* 平均时间复杂度 O(n^2)
* 空间复杂度    O(1)
* 稳定性       稳定
* 效率         对于少数元素之外的数列排序是很没有效率的
* @param arr 数组
* @param n 长度
*/
void BubbleSort(int arr[], int n) {
    for (int i=0;i<n-1;i++)//每次最大元素就像气泡一样浮到数组的最后
    {
        for(int j=0;j<n-1-i;j++) //依次比较相邻的两个元素,使较大的那个向后移
        {
            if(arr[j]>arr[j+1]) //如果条件改为arr[j] >= arr[j+1] 则变为不稳定的排序算法
            {
                Swap(arr, j, j + 1);
            }
        }
    }
}

上述代码对序列{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的实现过程如下
在这里插入图片描述
使用冒泡排序为一列数字进行排序的过程如右图所示:
在这里插入图片描述

冒泡排序的改进:鸡尾酒排序

鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进,此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较数组序列里的每个元素。它可以得到比冒泡排序稍微好一点的效能。

鸡尾酒排序代码如下:

void Swap(int arr[], int i, int j)
{
    int temp=arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

/**
* 鸡尾酒排序 是冒泡排序改进版
* 最差时间复杂度 O(n^2)
* 最优时间复杂度 如果序列在一开始已经大部分排序过的话,会接近O(n)
* 平均时间复杂度 O(n^2)
* 空间复杂度     O(1)
* 稳定性         稳定
* 效率           比冒泡排序性能较好,但在乱数序列的状态下,鸡尾酒排序与冒泡排序的效率都很差劲
* @param arr 数组
* @param n 长度
*/
void CocktailSort(int arr[],int n)
{
    int left=0;      //初始化排序区左索引
    int right=n-1;   //初始化排序区右索引
    while (right>left)
    {
        for (int j = left; j < right; j++) //前半轮排序 将排序区中的最大值移动到最右边
        {
            if (arr[j] > arr[j + 1]) {
                Swap(arr, j, j + 1);
            }
        }
        right--;//更新排序区右索引
        for (int j = right; j > left; j--)  //后半轮排序 将排序区中的最小值移动到最左边
        {
            if (arr[j] < arr[j - 1]) {
                Swap(arr, j, j - 1);
            }
        }
        left++;//更新排序区左索引
    }
}

使用鸡尾酒排序为一列数字进行排序的过程如下图所示:
在这里插入图片描述
  以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值