C语言 - 冒泡排序法
/*本程序用于比较两种不同的冒泡排序法对同一个样本排序时的运算次数。程序随机生成了20组*/
/*样本,对于每一组样本,程序将会输出排序前的样本、排序后的样本、当前样本的运算次数统计*/
/*数据。程序会实时地把输出记录在本地文件D:\BubbleSort.txt中。同时,程序还为20组样本的*/
/*运算次数统计数据单独生成了一个记录文件副本D:\BubbleSortStatistic.txt */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int sornum1_inta[10000];//sort number,存储使用第一种冒泡排序法的样本(样本1)
int sornum2_inta[10000];
//sort number,sornum1的副本,使用第二种冒泡排序法排序(样本2)
int smpnum_int = 20;//sample number,样本数
long long int asmnum1_ll , asmnum2_ll;//assignment number,赋值的次数
long long int comnum1_ll , comnum2_ll;//compare number,比较的次数
long long int allnum1_ll , allnum2_ll;//all number,总运算次数
FILE *res_fp;//result FILE pointer,记录输出结果的文件
FILE *stc_fp;//statistic FILE pointer,记录统计数据的文件
void prt1(void);
void sor1(void);
void prtsor1(void);
void prt2(void);
void sor2(void);
void prtsor2(void);
void prtstc(void);
void prtstc_f(void);
void prtstc_sf(void);
int main(int argc, char const *argv[])
{
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
srand((unsigned int)(time(NULL)));
res_fp = fopen("D:\\BubbleSort.txt","w+");
stc_fp = fopen("D:\\BubbleSortStatistic.txt","w+");
while(smpnum_int--)
{
for (int maknum_i = 0; maknum_i < 10000; ++maknum_i)
//make number,用于生成随机数组的循环
{
sornum1_inta[maknum_i] = sornum2_inta[maknum_i] = rand();
}
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
prt1();
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
sor1();
prtsor1();
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
prt2();
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
sor2();
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
prtsor2();
printf(".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
fprintf(res_fp ,
".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n");
prtstc();
prtstc_f();
prtstc_sf();
srand((unsigned int)(time(NULL) + smpnum_int));
}
fclose(res_fp);
fclose(stc_fp);
system("pause");
return 0;
}
void prt1(void)
//print,此函数用于打印样本1
{
for (int i = 0; i < 10000; ++i)
{
printf("%5d ", sornum1_inta[i]);
fprintf(res_fp , "%5d ", sornum1_inta[i]);
if ((i + 1) % 10 == 0)
{
printf("\n\n");
fprintf(res_fp , "\n\n");
}
}
printf("\n\n");
fprintf(res_fp , "\n\n");
}
void sor1(void)
//sort,此函数使用第一种冒泡排序法对样本1排序
{
int curidx_int = 1;//current index,当前气泡的下标
asmnum1_ll = comnum1_ll = 0;
while(comnum1_ll++ , curidx_int <= 10000)
{
while((comnum1_ll++ , curidx_int != 0) && (comnum1_ll++ ,
sornum1_inta[curidx_int] < sornum1_inta[curidx_int - 1]))
{
int temp;
temp = sornum1_inta[curidx_int];
asmnum1_ll++;
sornum1_inta[curidx_int] = sornum1_inta[curidx_int - 1];
asmnum1_ll++;
sornum1_inta[curidx_int - 1] = temp;
asmnum1_ll++;
curidx_int--;
asmnum1_ll++;
}
curidx_int++;
asmnum1_ll++;
}
}
void prtsor1(void)
//print sorted number,此函数用于打印排好序的样本1
{
for (int i = 0; i < 10000; ++i)
{
printf("%5d ", sornum1_inta[i]);
fprintf(res_fp , "%5d ", sornum1_inta[i]);
if ((i + 1) % 10 == 0)
{
printf("\n\n");
fprintf(res_fp , "\n\n");
}
}
printf("\n\n");
fprintf(res_fp , "\n\n");
}
void prt2(void)
//print,此函数用于打印样本2
{
for (int i = 0; i < 10000; ++i)
{
printf("%5d ", sornum2_inta[i]);
fprintf(res_fp , "%5d ", sornum2_inta[i]);
if ((i + 1) % 10 == 0)
{
printf("\n\n");
fprintf(res_fp , "\n\n");
}
}
printf("\n\n");
fprintf(res_fp , "\n\n");
}
void sor2(void)
//sort,此函数使用第二种冒泡排序法对样本2排序
{
int ifchange = 1;
asmnum2_ll = comnum2_ll = 0;
while(comnum2_ll++ , ifchange == 1)
{
ifchange = 0;
asmnum2_ll++;
for (int curidx_i = 10000 - 2; (comnum2_ll++ , curidx_i >= 0);
asmnum2_ll++ , --curidx_i)
{
if (comnum2_ll++ ,
sornum2_inta[curidx_i] < sornum2_inta[curidx_i - 1])
{
int temp;
temp = sornum2_inta[curidx_i];
asmnum2_ll++;
sornum2_inta[curidx_i] = sornum2_inta[curidx_i - 1];
asmnum2_ll++;
sornum2_inta[curidx_i - 1] = temp;
asmnum2_ll++;
ifchange = 1;
asmnum2_ll++;
}
}
}
}
void prtsor2(void)
//print sorted number,此函数用于打印排好序的样本2
{
for (int i = 0; i < 10000; ++i)
{
printf("%5d ", sornum2_inta[i]);
fprintf(res_fp , "%5d ", sornum2_inta[i]);
if ((i + 1) % 10 == 0)
{
printf("\n\n");
fprintf(res_fp , "\n\n");
}
}
printf("\n\n");
fprintf(res_fp , "\n\n");
}
void prtstc(void)
//print statistic,用于打印统计得到的两种排序法各自的运算次数
{
allnum1_ll = asmnum1_ll + comnum1_ll;
allnum2_ll = asmnum2_ll + comnum2_ll;
printf("第一种冒泡排序法(单对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum1_ll , asmnum1_ll);
printf("第二种冒泡排序法(多对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum2_ll , asmnum2_ll);
(asmnum1_ll > asmnum2_ll)?
(printf("第一种冒泡排序法(单对象)赋值运算次数较多\n\n")):
(
(asmnum1_ll == asmnum2_ll)?
(printf("两种方法赋值运算次数一样多\n\n")):
(printf("第二种冒泡排序法(多对象)赋值运算次数较多\n\n"))
);
(comnum1_ll > comnum2_ll)?
(printf("第一种冒泡排序法(单对象)比较运算次数较多\n\n")):
(
(comnum1_ll == comnum2_ll)?
(printf("两种方法比较运算次数一样多\n\n")):
(printf("第二种冒泡排序法(多对象)比较运算次数较多\n\n"))
);
(allnum1_ll > allnum2_ll)?
(printf("第一种冒泡排序法(单对象)总运算次数较多\n\n")):
(
(allnum1_ll == allnum2_ll)?
(printf("两种方法总运算次数一样多\n\n")):
(printf("第二种冒泡排序法(多对象)总运算次数较多\n\n"))
);
}
void prtstc_f(void)
//print statistic to file,用于打印统计得到的两种排序法各自的运算次数到文件中
{
allnum1_ll = asmnum1_ll + comnum1_ll;
allnum2_ll = asmnum2_ll + comnum2_ll;
fprintf(res_fp , "第一种冒泡排序法(单对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum1_ll , asmnum1_ll);
fprintf(res_fp , "第二种冒泡排序法(多对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum2_ll , asmnum2_ll);
(asmnum1_ll > asmnum2_ll)?
(fprintf(res_fp , "第一种冒泡排序法(单对象)赋值运算次数较多\n\n")):
(
(asmnum1_ll == asmnum2_ll)?
(fprintf(res_fp , "两种方法赋值运算次数一样多\n\n")):
(fprintf(res_fp , "第二种冒泡排序法(多对象)赋值运算次数较多\n\n"))
);
(comnum1_ll > comnum2_ll)?
(fprintf(res_fp , "第一种冒泡排序法(单对象)比较运算次数较多\n\n")):
(
(comnum1_ll == comnum2_ll)?
(fprintf(res_fp , "两种方法比较运算次数一样多\n\n")):
(fprintf(res_fp , "第二种冒泡排序法(多对象)比较运算次数较多\n\n"))
);
(allnum1_ll > allnum2_ll)?
(fprintf(res_fp , "第一种冒泡排序法(单对象)总运算次数较多\n\n")):
(
(allnum1_ll == allnum2_ll)?
(fprintf(res_fp , "两种方法总运算次数一样多\n\n")):
(fprintf(res_fp , "第二种冒泡排序法(多对象)总运算次数较多\n\n"))
);
}
void prtstc_sf(void)
/*print statistic to statistic file,
用于打印统计得到的两种排序法各自的运算次数到统计数据文件中*/
{
allnum1_ll = asmnum1_ll + comnum1_ll;
allnum2_ll = asmnum2_ll + comnum2_ll;
fprintf(stc_fp , "第一种冒泡排序法(单对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum1_ll , asmnum1_ll);
fprintf(stc_fp , "第二种冒泡排序法(多对象)比较了 %lld 次,赋值了 %lld 次\n\n",
comnum2_ll , asmnum2_ll);
(asmnum1_ll > asmnum2_ll)?
(fprintf(stc_fp , "第一种冒泡排序法(单对象)赋值运算次数较多\n\n")):
(
(asmnum1_ll == asmnum2_ll)?
(fprintf(stc_fp , "两种方法赋值运算次数一样多\n\n")):
(fprintf(stc_fp , "第二种冒泡排序法(多对象)赋值运算次数较多\n\n"))
);
(comnum1_ll > comnum2_ll)?
(fprintf(stc_fp , "第一种冒泡排序法(单对象)比较运算次数较多\n\n")):
(
(comnum1_ll == comnum2_ll)?
(fprintf(stc_fp , "两种方法比较运算次数一样多\n\n")):
(fprintf(stc_fp , "第二种冒泡排序法(多对象)比较运算次数较多\n\n"))
);
(allnum1_ll > allnum2_ll)?
(fprintf(stc_fp , "第一种冒泡排序法(单对象)总运算次数较多\n\n")):
(
(allnum1_ll == allnum2_ll)?
(fprintf(stc_fp , "两种方法总运算次数一样多\n\n")):
(fprintf(stc_fp , "第二种冒泡排序法(多对象)总运算次数较多\n\n"))
);
fprintf(stc_fp, "\n************************************************"
"***********************************************************\n\n");
}