排序
基础算法
*排序
快排
不稳定(非复杂度)
时间复杂度:nlogn
思想:先排序,在递归。
题目:https://www.acwing.com/problem/content/787/
#include<iostream> using namespace std; const int maxn = 1e6+10; int n, q[maxn]; void quick_sort(int q[], int l, int r) { if(l >= r) return; int x = q[l+r >> 1], i = l - 1, j = r + 1; while(i < j) { do i++; while(q[i] < x); do j--; while(q[j] > x); if(i < j) swap(q[i], q[j]); } quick_sort(q, l, j); //这里的j换成i的话会变成死循环 quick_sort(q, j+1, r); } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &q[i]); quick_sort(q, 0, n-1); for(int i = 0; i < n; i++) printf("%d ", q[i]); return 0; }
注意:1.当x = q[l]时,若给出一段数字为已排好的数字,复杂度可达到O(n*n),故用x = q[l+r >>1].
2.do-while改成while会莫名其妙的tle
归并排序
稳定
时间复杂度:nlogn
思想:先递归再排序
题目:https://www.acwing.com/problem/content/789/
#include<iostream> using namespace std; const int maxn = 1e6+10; int n, q[maxn], res[maxn], num; //res作为临时数组更新 void merge_sort(int q[], int l, int r) { if(l >= r) return ; int mid = (l+r) >> 1; merge_sort(q, l, mid); merge_sort(q, mid+1, r); int i = l, j = mid+1, k = 0; while(i <= mid && j <= r) if(q[i] <= q[j]) res[k++] = q[i++]; else res[k++] = q[j++]; while(i <= mid) res[k++] = q[i++]; while(j <= r) res[k++] = q[j++]; for(int i = l, j = 0; i <= r; i ++, j ++) q[i] = res[j]; //注意这一步res数组的更新 } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &q[i]); merge_sort(q, 0, n-1); for(int i = 0; i < n; i++) printf("%d ", q[i]); return 0; }
*二分

浙公网安备 33010602011771号