冒泡排序及简单改进方法

别等时光非礼了梦想. 提交于 2019-12-23 21:55:59

冒泡排序
一、画图理解
在这里插入图片描述
二、代码实现

#include<stdio.h>
#include<Windows.h>

void BubbleSort(int *a, int num)
{
	int i = 0;
	for (i = 0; i < num - 1; i++)//num-1轮
	{
		int j = 0;
		for (j = 0; j <num - 1 - i; j++)//每轮中有num-1-i趟
		{
			if (a[j] > a[j + 1])//升序,若是想降序,变成<即可
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	  for (int k = 0; k < num; k++)
		{
			printf("%d  ", a[k]);
		}
	  printf("\n");
}



int main()
{
	int a[] = { 23, 45, 5, 7, 98, 6, 34, 98, 45 };
	int num = sizeof(a) / sizeof(a[0]);
	BubbleSort(a, num);
	system("pause");
	return 0;
}

三、代码优化
问题:若是输入的数据是有序的时候,代码也会从头到尾执行一遍,但是这样的话,代码的效率就不高,那么,有没有什么办法可以改变这种现象呢?

原理:给开头定义一个flag=1;
若是数据是有序的,那么程序循环内部的判决条件将不会实现,在循环中给flag赋的值将不会变化,则,在循环外面的条件flag==1成立,直接跳出循环,就实现了优化。

以下,就是优化后的代码。

#include<stdio.h>
#include<Windows.h>

void BubbleSort(int *a, int num)
{
	int i = 0;
    int flag = 1
	for (i = 0; i < num - 1; i++)//num-1轮
	{
		int j = 0;
		for (j = 0; j <num - 1 - i; j++)//每轮中有num-1-i趟
		{
			if (a[j] > a[j + 1])//升序,若是想降序,变成<即可
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag=0;
			}	
		}
		if (flag == 1)
			{
				break;
			}
	}
	for (int k = 0; k < num; k++)
	{
		printf("%d  ", a[k]);
	}
	printf("\n");
}


int main()
{
	int a[] = { 23, 45, 5, 7, 98, 6, 34, 98, 45 };
	int num = sizeof(a) / sizeof(a[0]);
	BubbleSort(a, num);
	system("pause");
	return 0;
}

菜鸟一枚,水平有限,谢众位博友批评指正,不胜感激!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!