人物:库珀与TARS,《星际穿越》中的人物。
看视频演示, https://www.douyin.com/video/7602172380894563636

库珀:“TARS,我们前方那些漂浮的彩色球体是什么?”

TARS(平静的机械音):“这是冒泡排序的宇宙,先生。每个彩色星球代表一个待排序的数字,体积越大数值越高。”

库珀:“它们为什么在黑暗中飘荡?”

TARS:“观察初始状态——红色星体在最左,蓝色在最右,但它们的体积毫无规律。就像未整理的虫洞数据。”

(屏幕上出现第一轮字样)

库珀:“那个红色星球开始移动了!”

TARS:“算法开始工作了。它在比较相邻星球——左边比右边大时,就会发生空间置换。”

(两个球体缓缓交换位置)

库珀:“就像轨道交会!”

TARS:“精确。每一轮都会有最大的‘星球’浮到右侧,就像气泡上升。看——那个红色巨行星正在向右漂移。”

库珀:“其他小行星在给它让路?”

TARS:“可以这么理解。每次比较都是重力调整——让数值大的天体获得更靠右的轨道坐标。”

(经过多轮交换后)

TARS:“最后一轮完成。现在星系已按体积——也就是数值——从小到大完美排列。”

库珀:“从青色小行星到绿色巨行星...这简直像银河系仪!”

TARS:“是的先生。这个可视化程序展示了最经典的排序算法。虽然效率不高,但能清晰展现计算之美——就像在太空中编排星辰。”

(屏幕显示“演示完毕”)

库珀:“谁创造了这个宇宙?”

TARS:“李兴球。他用C++精灵库搭建了这个数学剧场。要再看一遍吗?”

库珀:“不了。但这让我想起——有时候解决问题需要耐心,就像这些气泡,一轮一轮地...慢慢浮到正确位置。”

TARS:“深刻的理解,先生。现在是否要返回主程序?”

(画面渐黑,只留下整齐排列的彩色星球在黑暗中发光)

看代码:

#include "sprites.h"  //包含C++精灵库 
using namespace std;
Sprite rocket;      //建立角色叫rocket
struct Node{
   int value,x;  //值和坐标
   Sprite *sp;
};
vector<Node *> datas;
vector<string> colors = {"red","orange","yellow","green",
                         "cyan","blue","purple","pink"};
void swap(int i,int j){   //交换两个节点
     Node *a = datas[i];
     Node *b = datas[j];   
     //交换a和b的x从标,并且到达自己的坐标    
     int tempx = a->x;
     a->x = b->x;
     b->x = tempx;
     a->sp->go(a->x,0);
     b->sp->go(b->x,0);
     //在datas中的位置也要交换
     Node *temp ;   
     temp = datas[i];
     datas[i] = datas[j];
     datas[j] = temp;     
}
int main(){        //主功能块 
   g_screen->bgcolor("black");
   int n= randint(5,8);
   int x = 50-100*n/2;    //最左边节点坐标(起始)
   for(int i=0;i<n;i++){    //建立n个节点,放到datas中
      int v = randint(30,200);
      Node *node = new Node;
      node->value = v;
      node->x = x;
      //按顺序选择索引为i的颜色,组合成角色的造型图片
      string s = "res/circle_" + colors[i] + ".png";
      Sprite *js = new Sprite(s); //新建角色,以s为造型
      js->scale(v/100.0);        //把角色缩小,要不然太大了
      js->penup();  js->go(x,0); js->speed(1); //定好起始位置
      node->sp = js;             //节点包含有角色指针
      datas.push_back(node);      
      x = x + 100;     //每个节点相差100个单位
   }
   Sprite pen{"blank"}; 
   pen.up().color(0).sety(300).write("冒泡排序算法可视化演示程序",50);
   pen.color(30).sety(230).write("作者:李兴球,采用C++精灵库",30);
   pen.color(60).sety(180).write("C++精灵库作者:李兴球",20);
   rocket.wait(1).color("yellow").penup().sety(130).hide();
   //真正的冒泡排序核心程序开始了
   for(int j=1;j<n;j++){  //排序的核心程序在这里
      string s = "第 " + to_string(j) + " 轮";    
      //删除最早写的文字,然后写上新的文字,并且等待1秒  
      rocket.cleartxts(1).write(s,42).wait(1);
      for(int i=0;i<n-j;i++)   
         if(datas[i]->value > datas[i+1]->value ) //发现更大的,则交换
             swap(i,i+1);
      rocket.wait(1);
   }
   rocket.cleartxts(1).write("演示完毕!",42).done();     //完成了
   return 0;    //返回0
}

标签: none

添加新评论