前言
一种将无序数组进行排序的方法。
冒泡排序,主要思想:每次循环找到一个最大值或最小值放到数组最右边(通过左右元素依次替换实现)。
递归,主要思想:将任务转换为单一目的的循环,可以找到退出条件。
递归冒泡,主要思想:每次递归找到一个最大值或最小值放到数组最右边,通过循环次数条件退出。
接下来主要演示:普通冒泡排序、递归冒泡排序。
环境
编辑器: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");
}
执行结果参考: