冒泡

void main(){
    int num[x];
    for (int i = 0; i < x - 1; i++) {
         for (int j = 0; j < x - i - 1; j++) {
            if (num[j] > num[j + 1]) {
                int temp = num[j];
                num[j] = num[j + 1];
                num[j + 1] = temp;
            }
        }
    }
}

两层循环,外层循环次数为数组元素个数-1,内层循环次数为数组元素个数-当前外层循环次数(也就是上面说的i)-1,按上面

num[j] > num[j + 1]

其实本质就是每次从头开始把相邻的两个数进行对比,大的放到最后(一轮就能把最大的放大最后),然后继续重头开始比较,但是比较次数-1(因为最后的数肯定是最大的,第二轮后倒数第二的数就是第二大的,如此类推),可以简单想象为,每一轮外循环结束后,数组中最大的数会排最后,且数组长度必定比上一次的短1。

例:

原数组:3142,即x为4,外层循环的i<3

此时i=0,符合i<3,那么需要j<3,数组为:3142

i=0,j=0;——>判断j=0,符合j<3,开始比较num[0]和num[1],也就是比较3和1,需要交换,此时数组由3142为1342,然后j++,j=1

i=0,j=1;——>判断j=1,符合j<3,比较num[1]和num[2],也就是比较3和4,不需要交换,此时数组保持为1342,然后j++,j=2

i=0,j=2;——>判断j=2,符合j<3,比较num[3]和num[4],也就是比较4和2,需要交换,此时数组由1342为1324,然后j++,j=3

i=0,j=3;——>判断j=2,不符合j<3,跳出,内循环,此时i++,i=1,数组为:1324

此时i=1,符合i<3,那么需要j<2,数组为:1324

i=1,j=0;——>判断j=0,符合j<2,开始比较num[0]和num[1],也就是比较1和3,不需要交换,此时数组保持为1324,然后j++,j=1

i=1,j=1;——>判断j=1,符合j<2,开始比较num[1]和num[2],也就是比较3和2,需要交换,此时数组由1342为1234,然后j++,j=2

i=1,j=2;——>判断j=2,不符合j<2,跳出,内循环,此时i++,i=2,数组为:1234

此时i=2,符合i<3,那么需要j<1,数组为:1234

i=2,j=0;——>判断j=0,符合j<1,开始比较num[0]和num[1],也就是比较1和2,不需要交换,此时数组保持为1234,然后j++,j=1

i=2,j=1;——>判断j=1,不符合j<1,跳出,内循环,此时i++,i=3,数组为:1234

此时i=3,不符合i<3,外循环结束,数组结果为:1234

posted @ 2024-03-24 14:57  Morning枫  阅读(18)  评论(0编辑  收藏  举报