shaker 排序法 - 改良的冒泡排序(C)

本文介绍了一种改进版的冒泡排序算法——双向冒泡排序(也称作鸡尾酒排序)。该算法通过从左到右及从右到左两次遍历的方式减少排序所需遍历次数,提高效率。文中详细解释了其工作原理,并提供了完整的 C 语言实现。

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

#include<stdio.h>
#include<stdlib.h>

/*
shaker 排序法-改良的冒泡排序
采用双向进行:
先让气泡排序由左向右进行,再来让气泡排序由右往左进行 ,如此完成一次排序的动作,
而您必须使用leftright两个旗标来记录左右两端已排序的元素位置。
如:一个排序的例子如下所示:
排序前:45 19 77 81 13 28 18 19 77 11

往右排序:19 45 77 13 28 18 19 77 11 [81]
向左排序:[11] 19 45 77 13 28 18 19 77 [81]

往右排序:[11] 19 45 13 28 18 19 [77 77 81]
向左排序: [11 13] 19 45 18 28 19 [77 77 81]

往右排序: [11 13] 19 18 28 19 [45 77 77 81]
向左排序: [11 13 18] 19 19 28 [45 77 77 81]

往右排序: [11 13 18] 19 19 [28 45 77 77 81]
向左排序: [11 13 18 19 19] [28 45 77 77 81]
如上所示,括号中表示左右两边已排序完成的部份,当left > right时,则排序完成。
*/

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
void Shake_bubsort(int *num, int N)
{
    int i, j;
    int count = 1;
    int left = 0;
    int right = N - 1;
    for (i = 0; i < N ; i++)
    {
        for (j = left; j <= right-1; j++)
        {
            if (num[j] > num[j + 1])
            {
                swap(num[j], num[j + 1]);
            }
        }
        for (j = right; j >= left + 1; j--)
        {
            if (num[j] < num[j - 1])
                swap(num[j], num[j - 1]);
        }
        right--;
        left++;

        if (right < left)
            break;
        printf("%d次:", count++);
        for (int k = 0; k < N; k++)
        {
            printf("%d ", num[k]);
        }
        printf("\n");
    }

}   

int main()
{
    int num[10] = { 45, 19, 77, 81, 13, 28, 18, 19, 77, 11 };
    Shake_bubsort(num, 10);
    system("pause");
    return 0;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值