# 排序法動畫
## 1.0
```cpp=
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
void print(int a[],int n)
{
system("cls");
for(int i=0 ; i<n ; i++){
cout<<' ';
for(int j=0 ; j<n ; j++){
if(a[j]>=n-i)cout<<'|';
else cout<<' ';
}
cout<<endl;
}
cout<<' ';
for(int i=0 ; i<n ; i++){
cout<<'=';
}
cout<<endl;
Sleep(300);
}
int main()
{
srand(time(NULL));
cout<<"bubble sort"<<endl<<"輸入任意數字即可開始";
int n;
while(cin>>n)break;
n=20;
int a[n]={};
for(int i=0 ; i<n ; i++){
int rad=rand()%n;
while(a[rad]){
rad++;
if(rad>=n)rad=0;
}
a[rad]=i+1;
}
print(a,n);
int sum1=0,sum2=0;
for(int i=n-1 ; i>=0 ; i--){
for(int j=0 ; j<i ; j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
print(a,n);
sum1++;
}
sum2++;
}
}
cout<<"total swap: "<<sum1<<endl;
cout<<"total compare: "<<sum2<<endl;
}
```
## 2.0
### 更新
1. 各列之間間距加大
2. 排序部分改為函式以便新增其他排序
3. 輸出更改為每比較一次輸出一次(原本是交換數值一次更新一次)
4. 比較部分輸出紅色
```cpp=
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
void SetColor(int color = 7)
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void print(int a[],int n,int sw1, int sw2)
{
system("cls");
for(int i=0 ; i<n ; i++){
cout<<' ';
for(int j=0 ; j<n ; j++){
if(a[j]>=n-i){
if(j==sw1 || j==sw2)SetColor(12);
cout<<'|';
}
else cout<<' ';
SetColor();
cout<<' ';
}
cout<<endl;
}
cout<<' ';
for(int i=0 ; i<n*2 ; i++){
cout<<'=';
}
cout<<endl;
Sleep(100);
}
void bubblesort(int a[],int n)
{
int sswa=0,scom=0;
for(int i=n-1 ; i>=0 ; i--){
for(int j=0 ; j<i ; j++){
print(a,n,j,j+1);
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
sswa++;
}
scom++;
}
}
cout<<"total swap: "<<sswa<<endl;
cout<<"total comparison: "<<scom<<endl;
}
int main()
{
srand(time(NULL));
cout<<"Bubble Sort Animation"<<endl<<"Enter any word to start";
cin.get();
int n=25;
int a[n]={};
for(int i=0 ; i<n ; i++){
int rad=rand()%n;
while(a[rad]){
rad++;
if(rad>=n)rad=0;
}
a[rad]=i+1;
}
print(a,n,-1,-1);
bubblesort(a,n);
print(a,n,-1,-1);
}
```
# 3.0
```cpp=
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int sswa,scom,n;
void SetColor(int color = 7)
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void print(int a[],int sw1=-1, int sw2=-1)
{
system("cls");
for(int i=0 ; i<n ; i++){
cout<<' ';
for(int j=0 ; j<n ; j++){
if(a[j]>=n-i){
if(j==sw1 || j==sw2)SetColor(12);
cout<<'|';
}
else cout<<' ';
SetColor();
cout<<' ';
}
cout<<endl;
}
cout<<' ';
for(int i=0 ; i<n*2 ; i++){
cout<<'=';
}
cout<<endl;
Sleep(50);
}
void quicksort(int a[],int l,int r)
{
int m=(l+r)/2,pivot=a[m],i=l,j=r;
while(i<j){
while(a[i]<pivot){
i++;
scom++;
print(a,i,m);
}
scom++;
while(a[j]>pivot){
j--;
scom++;
print(a,j,m);
}
scom++;
swap(a[i],a[j]);
sswa++;
print(a,i,j);
scom++;
}
scom++;
if(i<r)quicksort(a,l,j);
if(j>l)quicksort(a,j,r);
}
void bubblesort(int a[])
{
for(int i=n-1 ; i>=0 ; i--){
for(int j=0 ; j<i ; j++){
print(a,j,j+1);
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
sswa++;
}
scom++;
}
}
}
void selectionsort(int a[])
{
int mn;
for(int i=0 ; i<n ; i++){
mn=i;
for(int j=i ; j<n ; j++){
if(a[j]<a[mn])mn=j;
print(a,mn,j);
scom++;
}
sswa++;
swap(a[i],a[mn]);
print(a,i,mn);
}
}
int main()
{
int which;
cout<<"Sort Animation"<<endl;
cout<<"Choose a sort:\n 1 bubble sort\n 2 quick sort \n 3 selection sort"<<endl;
cout<<"Enter your choose: ";
cin>>which;
while(which<1 || which>3){
cout<<"Please enter again: ";
cin>>which;
}
n=25;
int a[n]={};
for(int i=0 ; i<n ; i++){
int rad=rand()%n;
while(a[rad]){
rad++;
if(rad>=n)rad=0;
}
a[rad]=i+1;
}
sswa=0,scom=0;
print(a);
switch(which)
{
case 1:
bubblesort(a);
break;
case 2:
quicksort(a,0,n-1);
break;
case 3:
selectionsort(a);
break;
default:
break;
}
print(a);
cout<<"total swap: "<<sswa<<endl;
cout<<"total comparison: "<<scom<<endl;
}
```