递归冒泡排序的 C 程序
冒泡排序是最简单的排序算法之一,通过比较相邻元素对数据进行排序。所有元素都分阶段进行比较。第一阶段将最大值放在末尾,第二阶段将第二大元素放在倒数第二个位置,依此类推,直到完整列表排序完毕。
冒泡排序算法
int arr[5]= { 5,4,2,1,3 };
int i, j ;
从索引 i=0 遍历到 i<数组大小
从索引 j=0 遍历到数组大小 - i - 1
如果 arr[i]>arr[j],则将 arr[i] 与 arr[j] 交换
结束
递归冒泡排序
如果数组长度为 1,则返回
遍历数组一次并在末尾修复最大元素
对数组的其余部分(最后一个元素除外)递归执行步骤 2
示例
输入 − Arr[] = { 5,7,2,3,1,4 }; length=6
输出 − 排序后的数组:1 2 3 4 5 7
解释 −
第一关 5 7 2 3 1 4→交换→ 5 2 7 3 1 4 5 2 7 3 1 4→交换→ 5 2 3 7 1 4 5 2 3 7 1 4→交换→ 5 2 3 1 7 4 5 2 3 1 7 4→交换→ 5 2 3 1 4 7 第二遍 5 2 3 1 4 7→交换→ 2 5 3 1 4 7 2 5 3 1 4 7→交换→ 2 3 5 1 4 7 2 3 5 1 4 7→交换→ 2 3 1 5 4 7 2 3 1 5 4 7 → 交换 → 2 3 1 4 5 7 第三遍 2 3 1 4 5 7 → 交换 → 2 1 3 4 5 7 2 1 3 4 5 7 无交换第四次传递 2 1 3 4 5 7 → 交换 → 1 2 3 4 5 7 1 2 3 4 5 7 在后续迭代中不进行交换
输入 − Arr[ ] = { 1, 2, 3, 3, 2 };
输出 −排序数组:1 2 2 3 3
解释 −
第一遍 1 2 3 3 2 → swap → 1 2 3 2 3 1 2 3 2 3 → 交换 → 1 2 2 3 3 1 2 2 3 3 后续迭代中不进行交换 第二遍 1 2 2 3 3 后续迭代中不进行交换
以下程序中使用的方法如下
在冒泡排序的递归方法中,基本情况是数组长度 = 1。否则,使用单个 for 循环遍历数组并相应地交换元素。
获取输入数组 Arr[] 和长度作为其中元素的数量。
函数 recurbublSort(int arr[], int len) 获取数组及其长度,并使用递归方式对数组进行排序冒泡排序。
取一个变量 temp。
如果数组长度为 1,则返回void。
否则,使用单个 for 循环遍历数组,并针对每个元素 arr[i]>arr[i+1] 交换这些元素。
< /li>设置 temp=arr[i]、arr[i]=arr[i+1] 和 arr[i+1]=temp。
- < p>现在将长度减少 1,因为前一个循环将最大元素放在了最后的位置。
对 recurbublSort(arr,len) 进行递归调用。
在所有调用结束时,当 len 变为 1 时,我们将退出递归,并且数组将被排序。
打印主程序内的排序数组。
示例
#include <stdio.h> void recurbublSort(int arr[], int len){ int temp; if (len == 1){ return; } for (int i=0; i<len-1; i++){ if (arr[i] > arr[i+1]){ temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } len=len-1; recurbublSort(arr, len); } int main(){ int Arr[] = {21, 34, 20, 31, 78, 43, 66}; int length = sizeof(Arr)/sizeof(Arr[0]); recurbublSort(Arr, length); printf("Sorted array : "); for(int i=0;i<length;i++){ printf("%d ",Arr[i]); } return 0; }
输出
如果我们运行上述代码,它将生成以下输出
Sorted array: 20 21 31 34 43 66 78