冒泡排序与选择排序

点击查看代码
#include <stdio.h>

int main(){ 
     // 冒泡排序
    /**
     * 冒泡排序是从头开始,相邻两个元素进行比较
     * 要通过双重循环,第一重循环是元素间要比较的轮数,终止条件是元素个数减一,
     * 因为第一次是将数组中最大的元素移动到倒数第一个,第二次是将数组中第二大的数移动到倒数第二个
     * ···由此可推,最后一个最小的元素便不用再进行比较
     * 第二重循环是从头开始,相邻两个元素进行比较,(3和2比,3大,则交换两者位置→arr[0]=2,arr[1]=3;
     * 接着3和1比,3大,则交换→arr[1]=1,arr[2]=3;接着3和6比,6大,不变;接着6和5比,6大,交换→arr[3]=5,arr[4]=6)···
     * 如此其终止条件为元素个数减1再减i,因为倒数i个元素已经排序好,是最大的i个元素
    **/
    int arr[] = {3,2,1,6,5,8,7,9,4,0};

    //可以增加动态计算数组长度
    //int arrSize = sizeof(arr) / sizeof(arr[0]);

    for(int i = 0 ; i < 10 - 1 ; i++){
        for(int j = 0 ; j < 10 - 1- i ; j++){
            if(arr[j] > arr[j+1]){
                int t = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = t;
            }
        }
    }
    for(int i = 0 ; i < 10 ; i++){
        printf("%d",arr[i]);
    }

    // 选择排序
    /*
    选择排序的核心是:每一轮确定「未排序区间第一个元素」的最终位置
    双重循环:
    1. 第一重循环(i):控制未排序区间的起点(i是当前要确定位置的元素下标),
       终止条件是元素个数-1(因为最后1个元素无需再比较,自然是最大值);
    2. 第二重循环(j):从i的下一个元素开始,遍历所有未排序元素,
       把比arr2[i]小的元素逐个和arr2[i]交换,最终让arr2[i]成为未排序区间的最小值;
    (此版本是选择排序的“交换版”,每轮找到更小的元素就立即交换,逻辑正确)
    */
    int arr2[] = {3,2,1,6,5,8,7,9,4,0};
    for(int i = 0  ; i < 10 - 1 ; i++){
        for(int j = i + 1; j < 10 ; j++){
            if(arr2[i] > arr2[j]){
                int t = arr2[i];
                arr2[i] = arr2[j];
                arr2[j] = t;
            }
        }
    }
    for(int i = 0 ; i < 10 ; i++){
        printf("%d",arr2[i]);
    }
    return 0;
}
posted @ 2025-12-18 13:26  无酒无剑  阅读(13)  评论(0)    收藏  举报