美文网首页
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