int primes[N], cnt; //primes[]存储所有素数 bool st[N]; //st[x]存储x是否被筛过
voidget_primes(int n){ for(int i = 2; i <= n; i++) { if(!st[i]) primes[cnt++] = i; //primes[j] * i <= n 转化为 primes[j] <= n / i for(int j = 0; primes[j] <= n / i; j++) { st[i * primes[j]] = true; //primes[j] * i 为合数 if(i % primes[j] == 0) break; //确保primes[j]是这个合数的最小质因子 } } }
排序
比较
排序方法
平均情况
最好情况
最坏情况
辅助空间
稳定性
冒泡排序
O(n2)
O(n)
O(n2)
O(1)
稳定
简单选择排序
O(n2)
O(n2)
O(n2)
O(1)
稳定
直接插入排序
O(n2)
O(n)
O(n2)
O(1)
稳定
希尔排序
O(nlogn)~O(n2)
O(n1.3)
O(n2)
O(1)
不稳定
堆排序
O(nlogn)
O(nlogn)
O(nlogn)
O(1)
不稳定
归并排序
O(nlogn)
O(nlogn)
O(nlogn)
O(n)
稳定
快速排序
O(nlogn)
O(nlogn)
O(n2)
O(logn)~O(n)
不稳定
冒泡排序
1 2 3 4 5 6
voidbubble_sort(int arr[], int len){ for (int i = 0; i < len - 1; i++) for (int j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]); }
直接插入排序
1 2 3 4 5
voidinsert_sort(int a[], int n){ for(int i = 1; i < n; i++) for(int j = i - 1; j >= 0 && a[j] > a[j + 1]; j--) swap(a[j], a[j + 1]); }
简单选择排序
1 2 3 4 5 6 7 8
voidselection_sort(int a[], int n){ for(int i = 0; i < n - 1; i++) { int min = i; for(int j = i + 1; j < n; j++) if(a[j] < a[min]) min = j; swap(a[i], a[min]); } }
希尔排序
1 2 3 4 5 6 7 8 9
voidshell_sort(int a[], int n){ int gap = 1; //步长 while(gap < n / 3) gap = 3 * gap + 1; for(; gap > 0; gap /= 3) for(int i = gap; i < n; i++) for(int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap) //每个元素与自己组内的数据进行直接插入排序 swap(a[j], a[j + gap]); }
voiddown(int u){ int t = u; if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1; if (u != t) { swap(h[u], h[t]); down(t); } }
voidup(int u){ while (u / 2 && h[u / 2] > h[u]) { swap(h[u / 2], h[u]); u /= 2; } }
voidheap_sort(){ //先要建立小根堆,最终得到递减数列 for (int i = size / 2; i; i--) //建立小根堆 down(i); int t = size; //暂存size while(size) { swap(h[1], h[size--]); down(1); } size = t; }