OI中的花样排序方法
排序算法多种多样 ,性质也大多不同。
选择排序
时间复杂度:O(n2) ,不稳定排序
1 2 3 4 5 6 7 8 9 10 11 12 13
| void selectionSort(int* a,int n){ for(int i = 1;i < n;i++){ int ith = i; for(int j = i + 1;j <= n;j++){ if(a[j] < a[ith]) ith = j; } int t = a[i]; a[i] = a[ith]; a[ith] = t; }
}
|
冒泡排序
时间复杂度:O(n2) ,稳定排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void bubbleSort(int* a,int n){ bool flag = true; while(flag){ flag = false; for(int i = 1;i < n;i++){ if(a[i] > a[i + 1]){ flag = true; int t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } } }
|
插入排序
时间复杂度:O(n2) , 稳定排序
1 2 3 4 5 6 7 8 9 10 11
| void insertionSort(int* a,int n){ for(int i = 2;i <= n;i++){ int key = a[i]; int j = i - 1; while(j > 0 && a[j] > key){ a[j + 1] = a[j]; --j; } a[j + 1] = key; } }
|
计数排序
时间复杂度:O(n+w),其中w表示待排序数值的值域,稳定排序
1 2 3 4 5 6 7 8 9 10 11
| const int MAXN = 10010; const int MAXM = 10086;
int n, w, a[MAXN], b[MAXN], cnt[MAXM];
void countingSort() { memset(cnt,0,sizeof(cnt)); for(int i = 1;i <= n;i++) ++cnt[a[i]]; for(int i = 1;i <= w;i++) cnt[i] += cnt[i - 1]; for(int i = n;i >= 1;i--) b[cnt[a[i]]--] = a[i]; }
|