目录
做作业的时候遇到了双向冒泡的问题,于是把递归冒泡和双向冒泡再一次复习。
递归冒泡:
这个是本人最为常用的,代码简洁,附上注释供阅读:
#include<stdio.h>
#include<stdlib.h>
int bubble(int arr[], int L, int R)
{
if(L<R){ //*保证比较区间的存在
int i;
int flag = 0;
for(i=L;i<=R-1;i++){ //*当 i+1 到达右边界 R 时,i=R-1
if(arr[i] > arr[i+1]){ //*如果左边的数比右边的数大
int temp = arr[i]; //*则进行左右互换
arr[i] = arr[i+1];
arr[i+1] = temp;
flag = 1;
}
}
if (!flag)//*如果没有发生调换,说明已经排好序,不需要再冒泡
{
return 1;//*随便返回一个值,表示函数进程结束
}
//*结束一次冒泡排序,最大的数会排到第 R 位,但前面的数依然未排好序
bubble(arr,L,R-1); //*函数自我调用——递归,进行无限次冒泡排序,直至排好
}
}
int main()
{
int i;
int arr[10] = {123,34,234,12,546,345,35,324,546,54}; //*一个无序数组
int L, R;
scanf("%d %d", &L, &R); //*确定需要排序哪一段
bubble(arr,L,R); //*进行冒泡排序
for(i=0;i<10;i++){
printf("%d\t", arr[i]); //*将排好的有序数组输出
}
system("pause");
return 0;
}
双向冒泡:
双向冒泡的效率其实和单向冒泡排序是一样的,可以自己模拟一下,一个有 5 个元素的数组,一般而言,单向冒泡需要做 if 语句 4!次,即(5-1)!次。双向冒泡也是 4!次,并没有优势,反而增加了代码量,降低可读性,因此本人很少使用双向冒泡
双向冒泡的原理:
先进行向右的冒泡,把最大值排到最后一位,然后从倒数第二位开始,向左冒泡,把最小值排到第一位,接着从第二位开始,向右冒泡,找出最大值,放入倒数第二位,以此类推。
下面附上双向冒泡的代码,关注 two_bubble 函数部分即可:
#include<stdlib.h>
#include<stdio.h>
void two_bubble(int *a, int n);
void show_array(int *a, int n);
int main(void)
{
int a[10] = {12, 23, 32 ,231 ,12 , 123, 43 ,4 ,3, 1212};
show_array(a,10);
two_bubble(a,10);
printf("Now the array is:\n");
show_array(a,10);
system("pause");
return 0;
}
void two_bubble(int *a, int n)
{
int left = 0, right = n - 1;
while (left < right)
{
int i = left;
int flag = 0;
for (; i < right; i++)
{
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
flag = 1;
}
}
if (!flag)
{
break;
}
right--;
flag = 0;
for (i = right; i > left; i--)
{
if (a[i] < a[i - 1])
{
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
flag = 1;
}
}
if (!flag)
{
break;
}
left++;
}
}
void show_array(int *a, int n)
{
int i = 0;
for (; i < n; i++)
{
printf("%d\t", a[i]);
if (i == n - 1)
{
putchar('\n');
}
}
}
看到这里,你也不容易,喜提一枚排序算法,祝你学习快乐~
欢迎点赞关注~~~