C语言:十种排序(二) - 选择排序

2019-08-05  本文已影响0人  lzp1234

前言

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

选择排序,主要思想:找出列表中最小或最大值放入数组左侧或右侧。

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

递归选择排序,主要思想:每层递归找出一个最值。当找到最后一个元素时退出

接下来主要演示:普通选择排序、递归选择排序

环境

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

正文

代码参考:

#include <stdio.h>


// 递归,主要思想:将任务转换为单一目的的循环,可以找到退出条件。
// 选择排序,主要思想:找出列表中最小或最大值放入数组左侧或右侧。
// 递归选择排序,主要思想:每层递归找出一个最值。当找到最后一个元素时退出


// 普通选择排序,从小到大
// 包含两层循环,内层循环功能为找出剩余范围内最值,外层循环控制循环次数。
int* selection_sort_normal(int source_array[], int source_array_length)
{
    for (int i = 0; i < source_array_length - 1; i++)
    {
        int tmp_min_index = i;
        for (int j = i + 1; j < source_array_length; j++)
        {
            if (source_array[j] < source_array[tmp_min_index])
            {
                tmp_min_index = j;
            }
        }
        if (tmp_min_index != i)
        {
            int tmp_value = source_array[i];
            source_array[i] = source_array[tmp_min_index];
            source_array[tmp_min_index] = tmp_value;
        }
    }
    return source_array;
}


// 递归选择排序,从小到大
// 主要思想:每层递归找出一个最值。当找到最后一个元素时退出。loop_num 初始值应为0。通过 loop_num 退出递归。
int* selection_sort_recursive(int source_array[], int source_array_length, int loop_num)
{
    if (loop_num == source_array_length - 1)
    {
        return source_array;
    }

    int tmp_min_index = loop_num;
    for (int i = loop_num + 1; i < source_array_length; i++)
    {
        if (source_array[i] < source_array[tmp_min_index])
        {
            tmp_min_index = i;
        }
    }
    if (tmp_min_index != loop_num)
    {
        int tmp_value = source_array[loop_num];
        source_array[loop_num] = source_array[tmp_min_index];
        source_array[tmp_min_index] = tmp_value;
    }
    loop_num++;
    selection_sort_recursive(source_array, source_array_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");

    // 普通选择排序
    selection_sort_normal(test_list, test_list_length);
    printf("普通选择排序结果: \n");
    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");
    selection_sort_recursive(test_list, test_list_length, 0);
    for (int i = 0; i < test_list_length; i++)
    {
        printf("%d ", test_list[i]);
    }
    printf("\n");

    return 0;
}

执行结果参考:


image.png
上一篇 下一篇

猜你喜欢

热点阅读