void main(void){ ShowData(x,NUM_DATA); printf("\n"); BubSort(x,NUM_DATA); ShowData(x,NUM_DATA); printf("\n"); }
int main(int argc, char **argv) { int arrnm; int *val; if(argc < 2) { fprintf(stderr, "引数がたりん\n"); return -1; } if(!isdigit(argv[1][0])) { fprintf(stderr, "引数が数字じゃない\n"); return -1; } if(atoi(argv[1]) < 1) { fprintf(stderr, "引数が0か0より小さい\n"); return -1; } val = (int *)malloc(sizeof(int) * atoi(argv[1])); arrnm = atoi(argv[1]); printf("バブルソート\n"); AddNum(val, arrnm); printf("before:\n"); DispNm(val, arrnm); printf("\n"); BubSort(val, arrnm); printf("after:\n"); DispNm(val, arrnm); printf("クイックソート\n"); AddNum(val, arrnm); printf("before:\n"); DispNm(val, arrnm); printf("\n"); /* QuickSort(val, arrnm); */ /* printf("after:\n"); */ /* DispNm(val, arrnm); */ free(val); return 0; }
//****自定义绘图函数********************************* // 1.对窗口中跑动的恐龙进行排序贴图 // 2.恐龙贴图坐标修正 void MyPaint(HDC hdc) { ++uframe; int w,h,i; char sztxt[222]; sprintf(sztxt,"fps: %u",uframe); if(picNum == 8) picNum = 0; //在mdc中先贴上背景图 SelectObject(bufdc,bg); BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY); SetBkMode(mdc,TRANSPARENT); TextOut(mdc,0,0,sztxt,strlen(sztxt)); BubSort(draNum); //贴上恐龙图之前调用BubSort()函数进行排序 //下面这个for循环,按照目前恐龙的移动方向dra[i].dir,选取对应的位图到bufdc中,并设定截切的大小。每一张要在窗口上出现的恐龙图案依次先在mdc上进行透明贴图的操作。 for(i=0;i<draNum;i++) { SelectObject(bufdc,draPic[dra[i].dir]); switch(dra[i].dir) { case 0: w = 66; h = 94; break; case 1: w = 68; h = 82; break; case 2: w = 95; h = 99; break; case 3: w = 95; h = 99; break; } BitBlt(mdc,dra[i].x,dra[i].y,w,h,bufdc,picNum*w,h,SRCAND); BitBlt(mdc,dra[i].x,dra[i].y,w,h,bufdc,picNum*w,0,SRCPAINT); } //将最后画面显示在窗口中 BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY); tPre = GetTickCount(); //记录此次绘图时间 picNum++; //下面这个for循环,决定每一只恐龙下一次的移动方向及贴图坐标 for(i=0;i<draNum;i++) { switch(rand()%4) //随机数除以4的余数来决定下次移动方向,余数0,1,2,3分别代表上,下,左,右 { //case 0里面的代码,按照目前的移动方向来修正因为各个方向图案尺寸不一致而产生的贴图坐标误差,加入恐龙每次移动的单位量(上,下,左,右每次20个单位)而得到下次新的贴图坐标 case 0: //上 switch(dra[i].dir) { case 0: dra[i].y -= 20; break; case 1: dra[i].x += 12; dra[i].y -= 31; break; case 2: dra[i].x += 14; dra[i].y -= 20; break; case 3: dra[i].x += 14; dra[i].y -= 20; break; } //在计算出新的贴图坐标之后,还需判断此新的坐标会不会使得恐龙贴图超出窗口边界,若超出,则将该方向上的坐标设定为刚好等于临界值 if(dra[i].y < 0) dra[i].y = 0; dra[i].dir = 0; break; //其他方向按照和上面相同的方法计算 case 1: //下 switch(dra[i].dir) { case 0: dra[i].x -= 12; dra[i].y += 31; break; case 1: dra[i].y += 20; break; case 2: dra[i].x += 15; dra[i].y += 29; break; case 3: dra[i].x += 15; dra[i].y += 29; break; } if(dra[i].y > 370) dra[i].y = 370; dra[i].dir = 1; break; case 2: //左 switch(dra[i].dir) { case 0: dra[i].x -= 34; break; case 1: dra[i].x -= 34; dra[i].y -= 9; break; case 2: dra[i].x -= 20; break; case 3: dra[i].x -= 20; break; } if(dra[i].x < 0) dra[i].x = 0; dra[i].dir = 2; break; case 3: //右 switch(dra[i].dir) { case 0: dra[i].x += 16; break; case 1: dra[i].x += 16; dra[i].y -= 10; break; case 2: dra[i].x += 20; break; case 3: dra[i].x += 20; break; } if(dra[i].x > 535) dra[i].x = 535; dra[i].dir = 3; break; } } }
//****自定义绘图函数********************************* // 1.对窗口中跑动的恐龙进行排序贴图 // 2.恐龙贴图坐标修正 void MyPaint(HDC hdc) { int w, h, i; clockRecord = clock(); // 记录每帧起始时间 if (picNum == 8) picNum = 0; //在mdc中先贴上背景图 SelectObject(bufdc, bg); BitBlt(mdc, 0, 0, 640, 480, bufdc, 0, 0, SRCCOPY); // 贴上恐龙图之前调用BubSort()函数进行排序 // 选择排序算法 // 可以明显看出两个排序算法——起泡排序和归并排序——的效率差距 switch (sortMethod) { case 0: mergeSort(dra); break; default: BubSort(draNum); break; } //下面这个for循环,按照目前恐龙的移动方向dra[i].dir, //选取对应的位图到bufdc中,并设定截切的大小。 //每一张要在窗口上出现的恐龙图案依次先在mdc上进行透明贴图的操作。 for (i = 0; i < draNum; i++) { SelectObject(bufdc, draPic[dra[i].Dir()]); switch (dra[i].Dir()) { case 0: w = 66; h = 94; break; case 1: w = 68; h = 82; break; case 2: w = 95; h = 99; break; case 3: w = 95; h = 99; break; } BitBlt(mdc, (int)dra[i].X(), (int)dra[i].Y(), w, h, bufdc, picNum*w, h, SRCAND); BitBlt(mdc, (int)dra[i].X(), (int)dra[i].Y(), w, h, bufdc, picNum*w, 0, SRCPAINT); } //将最后画面显示在窗口中 BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY); tPre = GetTickCount(); //记录此次绘图时间 picNum++; //下面这个for循环,决定每一只恐龙下一次的移动方向及贴图坐标 for (i = 0; i < draNum; i++) { dra[i].update(); /* //随机数除以4的余数来决定下次移动方向,余数0,1,2,3分别代表上,下,左,右 switch (rand() % 4) { //case 0里面的代码,按照目前的移动方向来修正因为各个方向图案尺寸不一致而产生的贴图坐标误差, //加入恐龙每次移动的单位量(上,下,左,右每次20个单位)而得到下次新的贴图坐标 case 0: //上 switch (dra[i].Dir()) { case 0: dra[i].Y(dra[i].Y() - 20); break; case 1: dra[i].X(dra[i].X() + 2); dra[i].Y(dra[i].Y() - 31); break; case 2: dra[i].X(dra[i].X() + 14); dra[i].Y(dra[i].Y() - 31); break; case 3: dra[i].X(dra[i].X() + 14); dra[i].Y(dra[i].Y() - 20); break; } //在计算出新的贴图坐标之后,还需判断此新的坐标会不会使得恐龙贴图超出窗口边界, //若超出,则将该方向上的坐标设定为刚好等于临界值 if (dra[i].Y() < 0) dra[i].Y(0); dra[i].Dir(0); break; //其他方向按照和上面相同的方法计算 case 1: //下 switch (dra[i].Dir()) { case 0: dra[i].X(dra[i].X() - 2); dra[i].Y(dra[i].Y() + 31); break; case 1: dra[i].Y(dra[i].Y() + 20); break; case 2: dra[i].X(dra[i].X() + 15); dra[i].Y(dra[i].Y() + 29); break; case 3: dra[i].X(dra[i].X() + 15); dra[i].Y(dra[i].Y() + 29); break; } if (dra[i].Y() > 370) dra[i].Y(370); dra[i].Dir(1); break; case 2: //左 switch (dra[i].Dir()) { case 0: dra[i].X(dra[i].X() - 34); break; case 1: dra[i].X(dra[i].X() - 34); dra[i].Y(dra[i].Y() - 9); break; case 2: dra[i].X(dra[i].X() - 20); break; case 3: dra[i].X(dra[i].X() - 20); break; } if (dra[i].X() < 0) dra[i].X(0); dra[i].Dir(2); break; case 3: //右 switch (dra[i].Dir()) { case 0: dra[i].X(dra[i].X() + 6); break; case 1: dra[i].X(dra[i].X() + 6); dra[i].Y(dra[i].Y() - 10); break; case 2: dra[i].X(dra[i].X() + 20); break; case 3: dra[i].X(dra[i].X() + 20); break; } if (dra[i].X() > 535) dra[i].X(535); dra[i].Dir(3); break; } */ } cout << "每帧刷新时间:\t" << (clockRecord - clock()) << endl; }