优化后的排序冒泡排序算法.c

#include
#include
#define MAX 30

int main(void)
{
	int i, j = 0, k = 0, min, sign, tag = 1;
	/*
	优化一、定义一个tag检查每次内层循环是否交换了数据
			情况1: 交换了数据
				说明此时数组仍处于无序状态,tag = 0;
			情况2:未交换数据
				说明此时数据已经有序, tag = 1
				不需要继续进行接下来的循环了 break; 跳出循环
	优化二、每次一冒泡进行遍历数组,只是冒上去了你想要的最大值或者最小值
			思考优化:每次带上去一个最大值或最小值,那么就可以,带回来最小
					 值或者最大值,那么排序所花费的时间就会减少一半。

	*/
	int array[MAX];
	printf("\n*************************************************************\n");
	printf("未排序的数组:");
	for (i = 0; i < MAX; i++)//给数组赋初值 并 打印出来
	{
		array[i] = (rand() % 100);//rand()函数包含在stdlib.h函数库中,功能是返回一个随机值
		printf("%4d", array[i]);
	}
	printf("\n*************************************************************\n");




	printf("\n\n\n*************************************************************\n");
	for (i = MAX - 1; i > 0; i--)
	{
	
		sign = k;//初始化标记位置
		tag = 1;//每次交换数据前需要初始化
		min = array[k];//中间无序序的是最小值
		for (j = k; j < i; j++)
		{
			if (array[j] > array[j + 1])//如果 array[j] 大于 array[j + 1]交换值,大的数字'冒'到了数组的后面去
			{
				int tmp;
				tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
				tag = 0;//交换数据,tag赋值为0
			}
			if (array[j] < min)
			{
				min = array[j];//更新最小值
				sign = j;//记录最小值的位置
			}
		}
		if (tag == 1)//未交换数据直接退出
		{
			break;
		}
		//交换找到的最小值和未排序的首元素的值
		//此处建议使用定义一个临时变量交换数值,如果当k == sign 时,就会出错
		{
			int tmp;
			tmp = array[k];
			array[k] = array[sign];
			array[sign] = tmp;
		}	
		k++;
	}
	printf("排序后的数组:");
	for (i = 0; i < MAX; i++)
	{
		printf("%4d",array[i]);
	}
	printf("\n*************************************************************\n");
	system("pause");
	return 0;
}
点赞