c++ 冒泡排序(减少循环次数)

发布时间 2023-08-21 00:43:05作者: 茫茫明明
#include<iostream>
using namespace std;

//打印数据
void printAll(int a[], int n)
{
    for(int i = 0; i < n; i++)
    {
        cout << "  " << a[i];
    }
    cout << endl;
}

//冒泡排序
void maoPaoPaiXu(int arr[],int n)
{
    for(int i = 0; i < n-1; i++)
    {
        //打印数据
        cout << "(" << i+1 << ")";
        printAll(arr,n);

        //排序标记
        bool biaoji = false;
        for(int m = 0; m < n-1-i; m++)
        {
            if(arr[m] > arr[m+1])
            {
                //交换数据
                int tmp = arr[m];
                arr[m] = arr[m+1];
                arr[m+1] = tmp;
                biaoji = true;
            }
        } 
        //判断是否移动数据标记(没有移动表明排序完成,直接跳出不在循环,减少循环次数)      
        if(!biaoji)
        {
            break;
        }
    }
}

int main()
{
    int arr[] = {1,2,400,5,6,8,9,234,434,304};
    int n = sizeof(arr) / sizeof(arr[0]);

    maoPaoPaiXu(arr,n);
    printAll(arr,n);

    return 0;
}

 

(使用 移动数据标记)运行结果:
(1) 1 2 400 5 6 8 9 234 434 304
(2) 1 2 5 6 8 9 234 400 304 434
(3) 1 2 5 6 8 9 234 304 400 434

1 2 5 6 8 9 234 304 400 434

(没有使用移动数据标记)运行结果:

(1) 1 2 400 5 6 8 9 234 434 304
(2) 1 2 5 6 8 9 234 400 304 434
(3) 1 2 5 6 8 9 234 304 400 434
(4) 1 2 5 6 8 9 234 304 400 434
(5) 1 2 5 6 8 9 234 304 400 434
(6) 1 2 5 6 8 9 234 304 400 434
(7) 1 2 5 6 8 9 234 304 400 434
(8) 1 2 5 6 8 9 234 304 400 434
(9) 1 2 5 6 8 9 234 304 400 434
1 2 5 6 8 9 234 304 400 434

以上结果对比明显有 移动数据标记 的运行次数减少,明显可以减少运行时间。