| template <class T> void SelectSort(T a[], int N, int& KCN, int& RMN) { KCN = 0; RMN = 0; for (int i = 0; i < N; i++) { for (int j = i + 1, k = i; j < N; j++) if (++KCN && a[j] < a[k]) k = j;//select min if (k != i) { swap(a[k], a[i]); RMN += 3; } } } |
| Sort ascending N=10000 TimeSpared: 721ms KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25 RMN=0 RMN/N=0 RMN/N^2=0 RMN/NlogN=0 Sort randomness N=10000 TimeSpared: 711ms KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25 RMN=29955 RMN/N=2.9955 RMN/N^2=0.00029955 RMN/NlogN=0.225434 Sort descending N=10000 TimeSpared: 711ms KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25 RMN=15000 RMN/N=1.5 RMN/N^2=0.00015 RMN/NlogN=0.112886 |
| template <class T> void FilterDown(T a[], int i, int N, int& KCN, int& RMN) { int child = 2 * i + 1; T temp = a[i]; while (child < N) { if (child < N - 1 && a[child] < a[child+1]) child++; if (++KCN && temp >= a[child]) break;//不需调整,结束调整 a[i] = a[child]; RMN++; i = child; child = 2 * i + 1; } a[i] = temp; RMN++; } template <class T> void HeapSort(T a[], int N, int& KCN, int& RMN) { int i; for (i = (N - 2)/2; i >= 0; i--) FilterDown<T>(a, i, N, KCN, RMN);//生成最大堆 for (i = N - 1; i > 0; i--) { swap(a[0], a[i]); RMN += 3; FilterDown(a, 0, i, KCN, RMN); } } |
| Sort ascending N=100000 TimeSpared: 110ms KCN=1556441 KCN/N=15.5644 KCN/N^2=0.000155644KCN/NlogN=0.937071 RMN=2000851 RMN/N=20.0085 RMN/N^2=0.000200085RMN/NlogN=1.20463 Sort randomness N=100000 TimeSpared: 160ms KCN=3047006 KCN/N=30.4701 KCN/N^2=0.000304701KCN/NlogN=1.83448 RMN=3898565 RMN/N=38.9857 RMN/N^2=0.000389857RMN/NlogN=2.34717 Sort descending N=100000 TimeSpared: 90ms KCN=4510383 KCN/N=45.1038 KCN/N^2=0.000451038KCN/NlogN=2.71552 RMN=5745996 RMN/N=57.46 RMN/N^2=0.0005746 RMN/NlogN=3.45943 |