C语言数据结构-冒泡与选择排序:原理与实现

冒泡排序

        重复地“遍历”要排序的列表,依次比较相邻的两个元素,如果它们的顺序错误(例如,前一个比后一个大),就交换它们。每一轮遍历都会将当前未排序部分中的最大(或最小)元素“冒泡”到其正确位置的末端,像水中的气泡一样上浮。

工作原理(以升序排序为例)

  1. 从列表的第一个元素开始,比较相邻的两个元素。
  2. 如果第一个比第二个大,就交换它们。
  3. 对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。完成这一步后,最大的元素就“冒泡”到了列表末尾
  4. 针对所有未排序的元素(除了上一轮已经确定位置的元素),重复上述步骤,直到没有任何一对数字需要比较(即列表完全有序)。
#include <stdio.h>

void bubbleSort(int *list, int n)
{
    int i;
    int j;
    int temp;
    
    // 外层循环控制排序轮数
    for(i = 0; i < n-1; i++)
    {
        // 内层循环进行相邻元素比较
        for(j = 0; j < n-1-i; j++)
        {
            if(list[j] > list[j+1])
            {
                temp = list[j];
                list[j] = list[j+1];
                list[j+1] = temp; 
            }
        }
    }
}

选择排序

        将列表分为已排序区间未排序区间。每次从未排序区间中选择最小(或最大)的元素,将其与未排序区间的第一个元素进行交换,从而将其放到已排序区间的末尾。如此重复,直到所有元素排序完毕。

工作原理(以升序排序为例)

  1. 初始时,已排序区间为空,未排序区间为整个列表。
  2. 在未排序序列中找到最小(或最大)的元素。
  3. 将其与未排序区间第一个元素进行交换
  4. 此时,未排序区间的第一个元素(即刚找到的最小值)就加入了已排序区间的末尾。
  5. 重复步骤2-4,直到未排序区间为空。
//选择排序函数
void selectSort(int *list, int n)
{
    int i;
    int j;
    int temp;
    int minIndex;  // 只记录最小值的下标,不需要 minvalue 变量
    
    for(i = 0; i < n-1; i++)
    {
        minIndex = i;    // 假设当前元素是最小值
        
        for(j = i+1; j < n; j++)
        {
            if(list[j] < list[minIndex])
            {
                minIndex = j;    // 更新最小值的下标
            }
        }
        
        // 如果最小值不是当前位置,交换
        if(minIndex != i)
        {
            temp = list[i];
            list[i] = list[minIndex];
            list[minIndex] = temp;
        }
    }
}

main主函数程序入口

int main()
{
    int i;
    int myarray[] = {3, 9, 2, 7, 5};
    int n = sizeof(myarray)/sizeof(int);  // 计算元素个数

    printf("采用冒泡排序前:\n");
    for(i = 0; i < n; i++)
    {
        printf("%d ", myarray[i]);  // 添加空格分隔
    }
    printf("\n");

    bubbleSort(myarray, n);   // 调用冒泡排序
    printf("采用冒泡排序后:\n");
    for(i = 0; i < n; i++)
    {
        printf("%d ", myarray[i]);
    }
    printf("\n\n");

    // 重新初始化数组 - 进行选择排序
    int myarray2[] = {3, 9, 2, 7, 5};
    int n2 = sizeof(myarray2)/sizeof(int);

    printf("采用选择排序前:\n");
    for(i = 0; i < n2; i++)
    {
        printf("%d ", myarray2[i]);
    }
    printf("\n");
    
    selectSort(myarray2, n2);   // 调用选择排序
    printf("采用选择排序后:\n");
    for(i = 0; i < n2; i++)
    {
        printf("%d ", myarray2[i]);
    }
    printf("\n");

    return 0;
}

运行结果展示

注意

        冒泡排序:

                1. 外层循环从 0 到 n-2

                2. 内层循环从 0 到 n-1-i

   选择排序:

                1. 添加条件判断,只有当最小值不在当前位置时才交换

                2. 内层循环从 i+1 开始

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值