C++冒泡排序练习

#include<iostream>
#include<string>
#include<ctime>
using namespace std;

#define max 100000

void Bubble(int arr[]);

int main()
{
    //int arr[6]={5,4,8,7,2,6};
    srand((unsigned int)time(NULL));

    int arr[max];
    for (int i = 0; i < max; i++)
    {
        arr[i]=rand()%max;//0~999
    }
    
    for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    {
        cout<<"arr["<<i<<"]"<<"="<<arr[i]<<endl;
    }    
    cout<<endl;
  
    Bubble(arr);

    for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    {
        cout<<"arr["<<i<<"]"<<"="<<arr[i]<<endl;
    }    
    return 0;
}

void Bubble(int arr[])              
{
    int flag=0;                             //设置一个flag,判断如果从第某次开始就没有交换就不需要继续验证后面的了
    for (int j = 0; j < max; j++)           //max可以通过宏来方便改写
    {
        for (int i = 0; i < max-j; i++)     //i为max-1时 max+1=6会出现越界,导致栈溢出(但是C++编译器不会检测是否有越界因为为了让程序跑的很快),且冒泡排序是先排正确末尾数据开始的,max-j可以减少程序运算次数

        {
            if (arr[i]>arr[i+1])
            {
                flag =1;
                int temp=arr[i+1];
                arr[i+1]=arr[i];
                arr[i]=temp;      
            }
        }
        if (flag==0)
        {
            break;
        }                  
    }    
}

在里面做了两处优化:

第一种是因为冒泡排序的原理是数列最后的数字最先排好,所以每次排好一个数字就可以减少一位对比运算 通过i<max-j;

第二种是在内循环过程中如果已经对比了是正确顺序,说明这个数列的顺序是对的那就直接跳出这个外循环结束排序,减少程序运算次数,通过加入flag;

还可以通过加法的方式不创建第三个变量进行两个变量的交换例如:

a=a+b;
b=a-b;
a=a-b;
posted @ 2020-07-28 22:41  归江渡鸟泅白浪  阅读(258)  评论(0)    收藏  举报