C语言结构体的冒泡排序

请问一下,这个冒泡排序他最终的结果没有达到预期,但是程序本身可以运行,请问究竟是什么地方出错了??

我想做的程序是一个可以根据人物年龄将所有人物排序的程序

#include <iostream>
#include <string>

using namespace std;

struct hero {
    string name;//姓名

    int age;//年龄

    string sex;//性别
};//定义英雄结构体

//定义冒泡排序函数
void BubbleSort(hero heroArray[],int len){

    for (int i = 0; i < len; i++) {
        for (int j = 0; j < i - 1; j++) {

            if ( heroArray[j].age >  heroArray[j + 1].age) {
                hero temp = heroArray[j];
                heroArray[j] = heroArray[j + 1];
                heroArray[j + 1] =  temp;

            }
        }
    }

}

void PrintHero(struct hero heroArray[],int len) {

    for (int i = 0; i < len; i++) {

        cout << "姓名:" << heroArray[i].name << "  年龄:" << heroArray[i].age
            << "  性别:" << heroArray[i].sex << endl;
    }

}


int main() {
    //创建英雄结构体
    hero heroArray[3] = {
        {"张飞",20,"男"},
        
        {"关羽",21,"男"},
        
        {"貂蝉",18,"女"}

    };
    
    //计算数量
    int len = sizeof(heroArray) / sizeof(heroArray[0]);
    
    //排序,年龄从高到低
    BubbleSort(heroArray,len);

    //打印
    PrintHero(heroArray, len);

    
    
    
    system("pause");

    return 0;
}

img

循环里的第二个for应该是len减1减 i 不是 i 减1
冒泡排序每一趟都得跑到未排序数组的最后一个,如果你是按从低到高排序,那么每一趟都会把最大的一个数据放到最后,然后第二趟的时候 i++,len - 1 - i,就再少往后走一个,如果你直接用 i - 1 作为判断条件最开始 i 等于0;你再想想看你这个循环是怎么执行的

for (int j = 0; j < i ; j++)
不是i-1
否则i是5的时候,j最多取到3,4没人管?