前言
一种将无序数组进行排序的方法。
选择排序,主要思想:找出列表中最小或最大值放入数组左侧或右侧。
递归,主要思想:将任务转换为单一目的的循环,可以找到退出条件
递归选择排序,主要思想:每层递归找出一个最值。当找到最后一个元素时退出
接下来主要演示:普通选择排序、递归选择排序。
环境
编辑器: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









网友评论