《寶可夢朱紫》校園賽刷錢方法
阿新 • • 發佈:2022-11-29
排序
簡單排序
插入排序
普 code
點選檢視程式碼
int n, cnt = 0; // 陣列長度 插入陣列長度 int a[10005], r[10005]; // 原陣列 插入陣列 void InsertSort(int x) { // 插入 x int pos = 0; // 記錄 x 應插入的位置 while (pos < cnt && r[pos] < x) pos++; // 直到找到大於等於 x 的數 for (int i = cnt; i > pos; i--) r[i] = r[i-1]; // 後移陣列 r[pos] = x; cnt++; // 插入陣列長度加一 }
空間優化 code
點選檢視程式碼
int n;
int a[10005];
void InsertSort() {
for (int i = 0; i < n; i++) {
int pos = 0, x = a[i];
while (pos < i && a[pos] < a[i]) pos++;
for (int k = i; k > pos; k--)
a[k] = a[k-1];
a[pos] = x;
}
}
氣泡排序
普 code
點選檢視程式碼
void bubble_sort(int* a, int n) { bool f = 1; while (f) { bool f = 0; for (int i = 1; i < n; i++) if (a[i] > a[i+1]) swap(a[i], a[i+1]), f = 1; } return ; }
常數優化 code
點選檢視程式碼
int n;
int a[10005];
void BubbleSort(int n, int a[]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j+1]) swap(a[j], a[j+1]);
}
}
}
選擇排序
普 code
點選檢視程式碼
int n; int a[10005]; void SelectSort(int n, int a[]) { for (int i = 0; i < n; i++) { int key = i; for (int j = i + 1; j < n; j++) if (a[j] < a[key]) key = j; swap(a[i], a[key]); } }
優化 code
點選檢視程式碼
int n;
int a[10005];
void SelectSort(int n, int a[]) {
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++)
if (a[j] < a[i]) swap(a[j], a[i]);
}
}
複雜度
時間複雜度
插入排序
O (n ^ 2)
氣泡排序
O (n ^ 2)
選擇排序
O (n ^ 2)
實用排序
歸併排序
O (n log n)
code
點選檢視程式碼
int n;
int a[10005], t[10005]; // a 原陣列 t 排序陣列
void MergeSort(int l, int r) {
if (l == r - 1) return ;
int mid = (l + r) >> 1;
MergeSort(l, mid); MergeSort(mid, r);
int p = l, q = mid, k = l;
while (p < mid && q < r) {
if (a[p] < a[q]) t[k++] = a[p++];
else t[k++] = a[q++];
}
while (p < mid) t[k++] = a[p++]; // 複製剩餘陣列
while (q < r) t[k++] = a[q++];
for (int i = l; i < r; i++)
a[i] = t[i];
}
快速排序
O (n log n)
code
點選檢視程式碼
int n;
int a[10005], t[10005];
void QuickSort(int l, int r) {
if (l >= r - 1) return ;
int flag = a[rand() % (r - l) + l];
int p = l, q = r;
for (int i = l; i < r; i++) {
if (a[i] < flag) t[p++] = a[i];
else if (a[i] > flag) t[--q] = a[i];
}
for (int i = p; i < q; i++) // 複製剩下等於 flag 的數
t[i] = flag;
for (int i = l; i < r; i++)
a[i] = t[i];
QuickSort(l, p);
QuickSort(q, r);
}