# 排序法動畫 ## 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; } ```