改进版的冒泡排序(双向冒泡算法)

本文介绍了传统的冒泡排序算法,并提出了一种改进方案——双向冒泡排序,该方法通过减少不必要的比较和交换操作来提高排序效率。

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

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
//一般的冒泡排序
void bubbleSort(int a[], int n)
{
    int i, j, k;
    int temp;
 
    for (i = 0; i < n; i++){    //最多做n-1趟排序
        for(j = 0 ;j < n - i - 1; j++){  
            if(a[j] > a[j + 1]){    //把大的值交换到后面
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }           
        printf("第%d次排序结果:", i + 1);
        for(k = 0; k < n; k++){
            printf("%d\t", a[k]);
        }
        //printf("\n");
    }
    printf("最终排序结果: ");
    for(k = 0; k < n; k++){
        printf("%d\t", a[k]);
    }
}
 
//改进版的冒泡排序(双向冒泡)
void bidBubbleSort(int a[], int n)
{
    int left, right, t, l, r, j, i = 0;
 
    left =0;
    right = n -1;
 
    //双向冒泡算法,极大的减少了循环排序的次数
    while(left < right)
    {
        //必须要给l和r赋值,否则若数组一开始就有序,则right=r中的r未赋值,即报错
        l = left + 1;
        r = right -1;
 
        //第一次循环将最大的值放到末尾
        for(j = left; j < right; j++)
        {
            if(a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
                r = j;
            }
        }
        right = r;
 
        //第二次循环将最小的值放到了开头
        for(j = right; j > left; j--)
        {
            if(a[j] < a[j - 1])
            {
                t = a[j];
                a[j] = a[j - 1];
                a[j - 1] = t;
                l = j;
            }
        }
        left = l;
 
        printf("第%d次排序结果:", i + 1);
        i++;
        for(j = 0; j < n; j++){
            printf("%d\t", a[j]);
        }
    }
     printf("最终排序结果: ");
    for(j = 0; j < n; j++){
        printf("%d\t", a[j]);
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int score1[] = {98, 69, 75, 47, 89, 90, 100, 70};
    bubbleSort(score1, 8);
    printf("\n");
    int score2[] = {98, 69, 75, 47, 89, 90, 100, 70};
    bidBubbleSort(score2, 8);
 
    system("pause");
    return 0;
}

 下面是运行效果:

可见,双向冒泡排序能大大减少排序的次数,值得借鉴!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值