#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;
}