随机数和冒泡排序的优化
#include<stdio.h>
#include<stdbool.h> //布尔数据类型的库
#include<time.h> //时间函数的库 time函数
#include<stdlib.h> //随机数函数 srand函数和rand函数
#define N 10 //数组的大小
int main(int argc,char** argv)
{
int a[N],i;
srand(time(0)); //?????
printf("排序前:");
for(i=0;i<N;i++) //给数组赋值
{
a[i]=rand()%180;
printf("a[%d]=%3d\t",i,a[i]); //0~180以内的数字
}
printf("\n");
for(i=0;i<N-1;i++) //排序 外for表示趟数
{
bool flag=false;
for(int j=N-1;j>i;j--) //从后面开始排序
{
if(a[j] < a[j-1]) //如果小数在后,则交换位置
{
int t=a[j-1]; //交换 这种是不会出现值溢出
a[j-1]=a[j];
a[j]=t;
flag=true;
}
}
if(!flag) //如果排过,表示有序
{
break;
}
}
printf("排序后:");
for(i=0;i<N;i++)
{
printf("a[%d]=%3d\t",i,a[i]);
}
printf("\n");
return 0;
}
执行结果:
我所写的“冒泡排序”–,时常耍“小聪明”,也是我经常写的“冒泡排序” bug百出还效率低等,不采用!
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 8 //数组的大小
//冒泡排序的升级1
int main(int argc,char** argv)
{
int a[N];
srand(time(0)); //随机数 ?????
int i=0;
printf("排序前:");
for(;i<N;i++)
{
a[i]=rand()%1000;
printf("a[%d]=%d\t",i,a[i]); //0~1000以内的数字
}
printf("\n");
for(i=0;i<N-1;i++) //要比较的对象 //少使用一个
{
for(int j=i+1;j<N;j++) //被比较的对象 ---a[1]到后面的被比较对象
{
//条件满足,不动
if(a[i]<a[j]) //小数后移
{
a[i]+=a[j],a[j]=a[i]-a[j],a[i]-=a[j];
}
//加减的交换方式会出现,加的和出现溢出,达到不能转换的问题
//a[i]>a[j]?a[i]:a[i]+=a[j],a[j]=a[i]-a[j],a[i]-=a[j]; //交换 小数前移 \
//三木运算符中不允许出现符合赋值语句
//1.先将两个数的和放在其中一个A,\
//2.然后用和减去A得到B,此时B的值已经被赋值原来A的值了 用B来接收 \
//3.最后用和A减去B(原来A的值),得到B的值,用A来接收\
//a[i]^=a[j],a[j]^=a[i],a[i]^=a[j]; //还没研究
}
}
printf("排序后:");
for(i=0;i<N;i++)
{
printf("a[%d]=%d\t",i,a[i]); //0~1000以内的数字
}
printf("\n");
return 0;
}
效果如下: