美文网首页
C语言:十种排序(一) - 冒泡排序

C语言:十种排序(一) - 冒泡排序

作者: lzp1234 | 来源:发表于2019-08-02 17:19 被阅读0次

    前言

    一种将无序数组进行排序的方法。

    冒泡排序,主要思想:每次循环找到一个最大值或最小值放到数组最右边(通过左右元素依次替换实现)。

    递归,主要思想:将任务转换为单一目的的循环,可以找到退出条件。

    递归冒泡,主要思想:每次递归找到一个最大值或最小值放到数组最右边,通过循环次数条件退出。

    接下来主要演示:普通冒泡排序、递归冒泡排序

    环境

    编辑器:vs2019
    文件:.c类型

    正文

    代码参考:

    #include <stdio.h>
    #include <stdlib.h>
    
    
    // 递归,主要思想:将任务转换为单一目的的循环,可以找到退出条件。
    // 冒泡排序,主要思想:每次循环找到一个最大值或最小值放到数组最右边(通过左右元素依次替换实现)。
    // 冒泡递归,主要思想:每次递归找到一个最大值或最小值放到数组最右边,通过循环次数条件退出。
    
    
    // 普通冒泡排序  从小到大
    // 两层循环,第二层循环实现找到最大的元素并移动到最右侧,第一层循环控制第二层循环的次数。
    int* bubble_sort_normal(int source_list[], int source_list_length)
    {
        for (int i = 0; i < source_list_length - 1; i++)
        {
            for (int j = 0; j < source_list_length - 1 - i; j++)
            {
                if (source_list[j] > source_list[j + 1])
                {
                    int tmp = source_list[j];
                    source_list[j] = source_list[j + 1];
                    source_list[j + 1] = tmp;
                }
            }
        }
        return source_list;
    }
    
    
    // 递归冒泡排序  从小到大
    // 这里多了一个参数:loop_num。通过这个参数退出递归。第初始值应设置为0。功能类似于普通冒泡的第一层循环。
    int* bubble_sort_recursive(int source_list[], int source_list_length, int loop_num)
    {
        if (source_list_length - 1 - loop_num == 0)
        {
            return source_list;
        }
        for (int i = 0; i < source_list_length - 1 - loop_num; i++)
        {
            if (source_list[i] > source_list[i + 1])
            {
                int tmp = source_list[i];
                source_list[i] = source_list[i + 1];
                source_list[i + 1] = tmp;
            }
        }
        loop_num++;
        bubble_sort_recursive(source_list, source_list_length, loop_num);
    }
    
    int* upset_array(int source_list[], int source_list_length)
    {
        for (int i = 0; i < source_list_length; i++)
        {
            int rand_index = rand() % source_list_length;
            int tmp_value = source_list[i];
            source_list[i] = source_list[rand_index];
            source_list[rand_index] = tmp_value;
        }
        return source_list;
    }
    
    int main()
    {
        // 生成随机测试列表
        int test_list[10];
        int test_list_length = sizeof(test_list) / sizeof(int);
        printf("测试列表: \n");
        for (int i = 0; i < test_list_length; i++)
        {
            test_list[i] = rand()%100;
            printf("%d ", test_list[i]);
        }
        printf("\n");
    
        // 普通冒泡排序结果:
        printf("普通冒泡排序结果: \n");
        bubble_sort_normal(test_list, test_list_length);
        for (int i = 0; i < test_list_length; i++)
        {
            printf("%d ", test_list[i]);
        }
        printf("\n");
    
        // 打乱数组
        upset_array(test_list, test_list_length);
        printf("打乱测试列表: \n");
        for (int i = 0; i < test_list_length; i++)
        {
            printf("%d ", test_list[i]);
        }
        printf("\n");
    
        // 递归冒泡排序结果:
        printf("递归冒泡排序结果: \n");
        bubble_sort_recursive(test_list, test_list_length, 0);
        for (int i = 0; i < test_list_length; i++)
        {
            printf("%d ", test_list[i]);
        }
        printf("\n");
    
    }
    

    执行结果参考:


    image.png

    相关文章

      网友评论

          本文标题:C语言:十种排序(一) - 冒泡排序

          本文链接:https://www.haomeiwen.com/subject/qunkdctx.html