美文网首页
C语言:十种排序(二) - 选择排序

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

作者: lzp1234 | 来源:发表于2019-08-05 11:12 被阅读0次

前言

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

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

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

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

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

环境

编辑器: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

相关文章

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

    前言 一种将无序数组进行排序的方法。 选择排序,主要思想:找出列表中最小或最大值放入数组左侧或右侧。 递归,主要思...

  • 七种常见的数组排序算法整理(C语言版本)

    ~~~C语言版本~~~ 冒泡排序 选择排序 直接插入排序 二分插入排序 希尔排序 快速排序 堆排序 排序算法是否稳...

  • DAY5C语言知识整理4(数组排序)+杀人游戏(约瑟夫环)+猜数

    c语言知识整理4 排序 分类 快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直...

  • 基本算法

    冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)

  • 常见十大排序算法概述

    排序算法概述 网上常见的排序算法有十种:冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排...

  • 排序算法

    均为C语言实现 操作对象均为一维int型数组 逆序 选择排序 冒泡排序 另一种写法 插入排序 原地插入排序 二分法

  • C语言中排序方法的使用

    C语言中排序方法 学习目的 今天我们学习了三种排序方法:冒泡排序法、选择排序法、插入排序法。 相关技术,及其实用 ...

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 2018-09-13第三次课

    学写简书 c语言排序算法 两种方法:选择与冒泡 选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起...

  • 基础算法笔记 python和C++

    二分查找 python code 选择排序 python code c++ code 快速排序 python c++

网友评论

      本文标题:C语言:十种排序(二) - 选择排序

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