C语言——递归冒泡与双向冒泡

目录

递归冒泡:

双向冒泡:

双向冒泡的原理:


做作业的时候遇到了双向冒泡的问题,于是把递归冒泡和双向冒泡再一次复习。

递归冒泡:

这个是本人最为常用的,代码简洁,附上注释供阅读:

#include
#include
int bubble(int arr[], int L, int R)
{
	if(L 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
#include
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');
        }
    }
}

看到这里,你也不容易,喜提一枚排序算法,祝你学习快乐~

欢迎点赞关注~~~

你可能感兴趣的:(算法,c语言,算法,排序算法)