C语言-冒泡排序

冒泡排序的原理:从左到右,两两元素进行比较,每进行一趟冒泡排序就会找到序列中最大的一个或最小的一个,并将其放到了最终应该出现的位置。

以从小到大排序为例,进行完第一趟冒泡排序后,序列中最大的那个元素就会浮到最右边;第二趟进行完后,序列中第二大的元素就会浮到倒数第二的位置,一趟一趟的进行比较交换后,最终实现从小到大的序列。


目录

1、冒泡排序的图解

2、冒泡排序的代码 

3、冒泡排序的优化 


1、冒泡排序的图解

 

这里我们就画出了第一趟的冒泡排序,由图可以看出数字9最终浮到了最右边。在进行完冒泡排序后,序列就实现了从小到大的排列,对于上图即 0123456789。

2、冒泡排序的代码 

输入十个数据,并用冒泡排序算法实现从小到大的排列。 

代码:

#include<stdio.h>
//用冒泡排序,排升序
//n个元素要n-1趟
void bubble_sort(int* p,int n)
{
	int i = 0, j = 0;
	for (i = 0; i < n-1; i++) //需要的趟数
	{
		for (j = 0; j < n-1-i ; j++)  //每一趟需要比较的对数
		{
			//交换
			if (p[j] > p[j + 1])
			{
				int temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}

int main()
{
	int a[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}
    printf("排序前:");
    for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
    printf("\n");
	bubble_sort(a,10);
	//传数组传的是地址
    printf("排序后:");
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

我们在写冒泡排序代码中的循环部分的时候,要弄清楚冒泡排序总共要进行几趟(n个元素要n-1趟),并且每一趟需要比较的对数(n-1-i,i从0开始)。

3、冒泡排序的优化 

优化后的代码如下:

#include<stdio.h>
//用冒泡排序,排升序
//n个元素要n-1趟
void bubble_sort(int* p, int n)
{
	int i = 0, j = 0;
	for (i = 0; i < n - 1; i++) //需要的趟数
	{
		//假设每一趟开始前已经有序
		int flag = 1;
		for (j = 0; j < n - 1 - i; j++)  //每一趟需要比较的对数
		{
			//交换
			if (p[j] > p[j + 1])
			{
				int temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}


int main()
{
	int a[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}
    printf("排序前:");
    for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
    printf("\n");
	bubble_sort(a,10);
	//传数组传的是地址
    printf("排序后:");
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

优化后的代码与之前有所不同的是函数中定义了 flag ,来检验是否进行了元素的交换。

运行结果: 

 

猜你喜欢

转载自blog.csdn.net/m0_61876562/article/details/130540859
今日推荐