归并排序:
void merge(vector<int>& a, int low, int mid, int high, vector<int>& aux){
int i = low, j = mid+1;
for(int k = low; k <= high; ++k){
aux[k] = a[k];
}
for (int k = low; k <= high; ++k) {
if (i > mid) a[k] = aux[j++];
else if (j > high) a[k] = aux[i++];
else if (aux[j] < aux[i]) a[k] = aux[j++];
else a[k] = aux[i++];
}
}
void mergesort(vector<int>& a) {
int n = a.size();
vector<int> aux(n, 0);
for (int i = 1; i < n; ++i) {
for (int j = 0; j < n-i; j +=i+i) {
merge(a, j, i+j-1, min(i+i+j-1, n-1), aux);
}
}
return;
}快速排序:
void swap(vector<int>& a, int i, int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
return;
}
int partition(vector<int> a, int lo, int hi) {
int i = lo, j = hi + 1;
int value = a[lo];
while (i < j){
while (a[++i] < value) if (i == hi) break;
while (a[--j] > value) if (j == lo) break;
swap(a, i, j);
}
swap(a, lo, j);
return j;
}
void sort(vector<int>& a, int beg, int end){
if (beg <= end) return;
int j = partition(a, beg, end);
sort(a, beg, j-1);
sort(a, j, end);
}
void quicksort(vector<int>& a){
sort(a, 0, a.size()-1);
}堆排序:
void sink(vector<int>& a, int k, int n){
while(2*k <= n){
int j = 2*k;
if(j < n && a[j] < a[j+1]) j++;
if (a[k] >= a[j]) retrun;
swap(a, k, j);
k = j;
}
}
void heapsort(vector<int>& a){
int n = a.size();
for (int k = n/2; k >= 1; k--) {
sink(a, k, n); // 建堆
}
while (n>1){
swap(a, 1, n--);
sink(a, 1, n);
}
}希尔排序:
void shellsort(vector<int>& a){
int n = a.size();
int h = 1;
while (h < n/3) h = 3*h + 1;
while (h >= 1){
for (int i = h; i < n; ++i){
for (int j = i; j >= h && a[j] < a[j-h]; j -= h){
swap(a, j, j-h);
}
}
h /= 3;
}
return;
}


京公网安备 11010502036488号