关于冒泡排序以及它的改进

冒泡排序是我们学习C语言的一个基本排序方法。
它的算法思想是:从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。第一轮结束后,继续第二轮,仍然从数组头部开始比较,让较大的元素逐渐往后移动,直到数组的倒数第二个元素为止。经过第二轮的比较,就可以找到次大的元素,并将它放到倒是第二个位置。以此类推,进行n-1(n为数组长度)轮“冒泡”后,就可以得到有序的元素。
代码实现如下:

#include<stdio.h>
void Swap_int(int *a, int *b)
{
    
    
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
    
    
	const int n = 10;
	int ar[n] = {
    
    45,23,56,78,12,34,90,89,67,123};
	int i = 0, j = 0;
	for(i = 0; i < n - 1; i ++)//i控制比较的趟数
	{
    
    
		for(j = 0; j < n-1-i; j ++)//j控制每一趟比较
		{
    
    
			if(ar[j] > ar[j+1])
			{
    
    
				Swap_int(&ar[j],&ar[j+1]);
			}
		}
	}
	for(i = 0; i < n; i ++)
	{
    
    
		printf("%d ",ar[i]);
	}
	printf("\n");
	return 0;
}

通过冒泡排序的算法我们不难看出,冒泡排序的效率不高,针对部分有序的数列,还是需要一趟一趟的比较,如果是完全有序的数列,经过此算法,还是需要n-1次冒泡,效率十分的低下。或者说,很死板。故,特改进算法如下:
改进思想:
冒泡排序第一趟得出一个最大值放在了最后的位置,接着我们就可以不用再回到第一个元素,我们就从倒数第二个元素开始,向上访问,依次比较,第二趟比较就可以得出一个最小值,到了第三趟比较,我们就可以从第二个元素开始,再依次向下比较,第四趟,从下往上,第五趟,从上往下。这样以此类推,最终得到一个有序的数列。
代码实现如下:

#include<stdio.h>
void Swap_int(int *a, int *b)
{
    
    
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
    
    
	const int n = 10;
	int t = n - 1, i= 0, k = 0;//t控制下端,k控制上端
	int ar[n] = {
    
    45,23,56,78,12,34,90,89,67,123};
	while( t - k >= 1)
	{
    
    
		for(i = k; i < t; i ++)//控制升序
		{
    
    
			if(ar[i] > ar[i+1])
			{
    
    
				Swap_int(&ar[i] , &ar[i+1]);
			}
		}	
		t -= 1;//把此趟的最大值冒出
		for(i = t; i > k; i --)//控制降序
		{
    
    
			if(ar[i] < ar[i-1])
			{
    
    
				Swap_int(&ar[i] , &ar[i-1]);
			}
		}	
		k += 1;//把此趟的最小值冒出
	}
	for(i = 0; i < n; i ++)
	{
    
    
		printf("%d ",ar[i]);
	}
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/104420592