###### tags: `Arduino`
# Arduino Sort Algorithm Visiable Project
* code
```cpp=
const int led_len = 40; //the length of led strit
const int Speed = 10; //millisecond
const int brightness = 10;
#include <ArxContainer.h>
using namespace arx;
vector<int,led_len> vec; // color & num array
vector<int,led_len> R,G,B; // rgb array
byte r=0, g=0, b=0;
#include "Wire.h"
//#include <Streaming.h>
#include <FastLED.h>
CRGB leds[led_len]; //led array
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define allclear lcd.clear(),lcd.setCursor(0,0);
#include <SoftwareSerial.h>
SoftwareSerial BT(4,5); //HC06 TX/RX pin
char val;
int count = 0;
void setup() {
delay(500); // power-up safety delay
FastLED.addLeds<WS2812, 13, RGB>(leds, led_len); //<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS)
FastLED.setBrightness(brightness);
BT.begin(9600);
lcd.init(); lcd.backlight(); allclear; lcd.print("Ready!");
randomSeed(analogRead(A0));
delay(2000);
pinMode(2,INPUT_PULLUP);
allclear;
reset();
delay(100);
//Serial.begin(9600);
//Serial << "start " << vec.size() << endl;
}
struct ct{
void reset(){count = 0;}
void plusplus(){count++; lcd.setCursor(13,1); lcd.print(count);}
};
ct times;
void bobbleSort(){
count = 0;
for(int i=0;i<led_len;i++){
for(int j=0;j<led_len-i;j++){
if(vec[j]>vec[j+1]){
int tmp = vec[j]; vec[j] = vec[j+1]; vec[j+1] = tmp;
setColor(j,vec[j]); setColor(j+1,vec[j+1]);
FastLED.show(),delay(Speed);
times.plusplus();
}
}
}
}
void quickSort(){
times.reset();
quick(0,led_len-1);
}
void quick(int l,int r){
if(l >= r) return;
int m = l, n = r, tmp = vec[m];
while(m < n){
while(m < n && vec[n] >= tmp) n--;
if(m < n){
vec[m++] = vec[n];
setColor(m-1,vec[m-1]);
FastLED.show(),delay(Speed*10);
times.plusplus();
}
while(m < n && vec[m] <= tmp) m++;
if(m < n){
vec[n--] = vec[m];
setColor(n+1,vec[n+1]);
FastLED.show(),delay(Speed*10);
times.plusplus();
}
}
vec[m] = tmp;
setColor(m,vec[m]);
quick(l,m-1);
quick(m+1,r);
}
void selectionSort(){
times.reset();
for(int i=0;i<led_len;i++){
int Min = led_len,minpos = 0;
for(int j=i;j<led_len;j++){
if(vec[j]<Min){ Min = vec[j]; minpos = j;}
}
int tmp = vec[i]; vec[i] = vec[minpos]; vec[minpos] = tmp;
setColor(i,vec[i]);
setColor(minpos,vec[minpos]);
FastLED.show(),delay(Speed*10);
times.plusplus();
}
}
void merge(int l, int m, int r){ //resemble the vector
int s1 = m - l + 1, s2 = r - m;
vector<int,led_len/2> lsub; vector<int,led_len/2> rsub;
for(int i=0;i<s1;i++)
lsub[i] = vec[l+i];
for(int i=0;i<s2;i++)
rsub[i] = vec[m + 1 + i];
int i=0, j=0, k=l;
while(i < s1 && j < s2){
if(lsub[i] < rsub[j]){
vec[k] = lsub[i];
setColor(k,vec[k]);
FastLED.show(),delay(Speed);
times.plusplus();
i++;
}else{
vec[k] = rsub[j];
setColor(k,vec[k]);
FastLED.show(),delay(Speed);
times.plusplus();
j++;
}
k++;
}
while(i < s1){ vec[k] = lsub[i]; i++,k++;}
while(j < s2){ vec[k] = rsub[j]; j++,k++;}
}
void mergesort(int l, int r){ //devide vector into two
if(l < r){
int m = (l+r)/2;
mergesort(l,m); mergesort(m+1,r); merge(l, m, r);
}
}
void mergeSort(){times.reset(); mergesort(0,led_len-1);
}
//----------------------------------------------------------------------
void setColor(int pos, int col){byte r=0, g=0, b=0; // |R---G---B|
if(col < led_len/2){
r = 255 - round(255*pos/led_len*2);
b = 0;
g = round(255*pos/led_len*2);
}else if(col >= led_len/2 && col < led_len){
r = 0;
b = round(255*(pos-led_len/2)/led_len*2);
g = 255 - round(255*(pos-led_len/2)/led_len*2);
}else if(col >= 40){
if(col-40 < led_len/2){
r = 255 - round(255*pos/led_len*2);
b = 0;
g = round(255*pos/led_len*2);
}else{
r = 0;
b = round(255*(pos-led_len/2)/led_len*2);
g = 255 - round(255*(pos-led_len/2)/led_len*2);
}
R[pos] = r, G[pos] = g, B[pos] = b;
}
leds[pos] = CRGB(g,r,b); //G,R,B
delay(10);
}
//another color setting algorithm
void setColorVer1(int clo, int pos){ // |--R----G----B--|
byte r=0, g=0, b=0;
if(clo < led_len/6&& clo >= 0){
r = (127*pos/led_len*6) + 128;
b = 128 - (127*pos/led_len*6);
g = 0;
}else if(clo < (led_len/2)){
r = 255 - (255*(pos - led_len/6)/(led_len/3));
g = (255*(pos - led_len/6)/(led_len/3));
b = 0;
}else if(clo < led_len*5/6){
g = 255 - (255*(pos - led_len/2)/(led_len/3));
b = (255*(pos - led_len/2)/(led_len/3));
r = 0;
}else{
r = (128*(pos - led_len*5/6)/(led_len/6));
b = 255 - ((pos - led_len*5/6)/(led_len/6));
g = 0;
}
leds[pos] = CRGB(g,r,b); //G,R,B
FastLED.show();
delay(10);
}
void reset(){
for(int i=0;i<led_len;i++){
vec[i] = i;
setColor(i,i+40);
//Serial << vec[i] << ' ';
delay(10);
}
FastLED.show(),delay(500);
//Serial << endl;
}
void shuffle(){
for(int i=0;i<led_len;i++){
int j = random(40), tmp = vec[i];
vec[i] = vec[j];
vec[j] = tmp;
}
for(int i=0;i<led_len;i++){
setColor(i,vec[i]);
//Serial << vec[i] << ", ";
}
FastLED.show(),delay(500);
//Serial << endl;
}
void rainbow(){
int tr = R[0], tg = G[0], tb = B[0];
for(int i=0;i<led_len;i++){
leds[i] = CRGB(R[i],G[i],B[i]);
if(i != led_len - 1){
R[i] = R[i+1];
G[i] = G[i+1];
B[i] = B[i+1];
}else{
R[i] = tr, G[i] = tg, B[i] = tb;
}
}
FastLED.show();delay(10);
}
bool fg = 0;
void loop() {
if(!digitalRead(2)){
if(fg == 0){allclear; lcd.print("Enter sort type"); fg = 1;}
while(BT.available()){ allclear; shuffle(); val = BT.read(); BT.println(val);
if(val == '1'){lcd.print("BobbleSort"); delay(500);lcd.setCursor(0,1); lcd.print("switch times:");}
else if(val == '2'){lcd.print("QuickSort");delay(500); delay(500);lcd.setCursor(0,1); lcd.print("switch times:");}
else if(val == '3'){lcd.print("SelectionSort");delay(500); delay(500);lcd.setCursor(0,1); lcd.print("switch times:");}
else if(val == '4'){lcd.print("MergeSort");delay(500); delay(500);lcd.setCursor(0,1); lcd.print("switch times:");}
else if(val == '0'){lcd.print("random");delay(1000); delay(500);lcd.setCursor(0,1); lcd.print("switch times:");}
else{lcd.print("Invalid type");}
switch(val){
case '1': bobbleSort(); break;
case '2': quickSort(); break;
case '3': selectionSort(); break;
case '4': mergeSort(); break;
case '0':
int n = random(4);
allclear;
if(n==1){lcd.print("BobbleSort"); delay(500); lcd.setCursor(0,1); lcd.print("switch times:"); bobbleSort();}
else if(n==2){lcd.print("QuickSort"); delay(500); lcd.setCursor(0,1); lcd.print("switch times:"); quickSort();}
else if(n==3){lcd.print("MergeSort"); delay(500); lcd.setCursor(0,1); lcd.print("switch times:"); mergeSort();}
else if(n==4){lcd.print("SelectionSort");delay(500); lcd.setCursor(0,1); lcd.print("switch times:"); selectionSort();}
break;
default:
break;
}
delay(2000); fg = 0; allclear; val = random(4); reset;
}
}else{
allclear;
lcd.print("Rainbow");
rainbow();
}
delay(100);
}
```