算法性质
算法 | 稳定性 | 时间复杂度 |
---|
计数排序 | 稳定 | O(n) |
基数排序 | 稳定 | O(n) |
桶排序 | 不稳定 | O(n) |
插入排序 | 稳定 | O(n^2) |
归并排序 | 稳定 | O(nlogn) |
快速排序 | 不稳定 | O(nlogn) |
希尔排序 | 不稳定 | O(n^2) |
堆排序 | 不稳定 | O(nlogn) |
代码实现
#include<iostream>
#include<vector>
using namespace std;
namespace sort{
/** * 计数排序 **/
void count_sort(vector<int>& in) {
int max_val = 0;
for (auto ele : in) {
if (ele < 0) return;
max_val = max(max_val, ele);
}
vector<int> counter(max_val, 0);
for (auto ele : in) counter[ele] += 1;
int cur = 0;
for (int i = 0; i < counter.size(); ++i) {
if (counter[i] != 0) {
int tmp = cur;
cur += counter[i];
while(tmp < cur) in[tmp++] = i;
}
}
}
/** * 基数排序 **/
int get_digit(int n, int pos) {
while (pos > 0) {
n /= 10;
pos--;
}
return n % 10;
}
int get_digit_length(int n) {
int len = 0;
while (n > 0) {
n /= 10;
len++;
}
return len;
}
void radix_sort(vector<int>& in) {
int max_len = 0;
for (auto ele : in) max_len = max(max_len, get_digit_length(ele));
for (int k = 0; k < max_len; ++k) {
int count[10] = {0};
for (auto ele : in) {
int radix = get_digit(ele, k);
count[radix]++;
}
int pos[10] = {0};
for (int i = 1; i < 10; ++i) pos[i] = pos[i - 1] + count[i - 1];
vector<int> in_tmp(in.begin(), in.end());
for (auto ele : in_tmp) {
int radix = get_digit(ele, k);
in[pos[radix]++] = ele;
}
cout<<">>Loop:"<<k<<"<<"<<endl;
for (auto ele : in) cout<<ele<<",";
cout<<endl;
}
}
/** * 桶排序 **/
void insert(vector<int>& in, int ele) {
in.push_back(0);
int i = in.size() - 2;
while (i >= 0 && in[i] > ele) {
in[i + 1] = in[i];
i--;
}
in[i + 1] = ele;
}
int get_bucket_index(int ele, int min_val, int max_val, int bucket_num) {
int bucket_range = (max_val + 1 - min_val) / bucket_num;
int ret = (ele - min_val) / bucket_range;
return ret;
}
void bucket_sort(vector<int>& in, int bucket_num = 10) {
vector<vector<int> > bucket(bucket_num + 1, vector<int>());
int max_val = numeric_limits<int>::min();
int min_val = numeric_limits<int>::min();
for (auto ele : in) {
min_val = min(ele, min_val);
max_val = max(ele, max_val);
}
for (auto ele : in) {
int key = get_bucket_index(ele, min_val, max_val, bucket_num);
insert(bucket[key], ele);
}
int j = 0;
for (int i = 0; i < bucket_num + 1; ++i) {
for (auto ele : bucket[i]) in[j++] = ele;
}
}
/** * 归并排序 **/
vector<int> merge_sort(vector<int>& in, int beg, int end) {
vector<int> ret;
if (beg >= end) return ret;
if (beg == end - 1) {
ret.push_back(in[beg]);
return ret;
}
int mid = (end + beg) / 2;
auto left = merge_sort(in, beg, mid);
auto right = merge_sort(in, mid, end);
int i = 0, j = 0;
while (i < left.size() && j < right.size()) {
if (left[i] <= right[j]) {
ret.push_back(left[i++]);
} else {
ret.push_back(right[j++]);
}
}
while (i < left.size()) {
ret.push_back(left[i++]);
}
while (j < right.size()) {
ret.push_back(right[j++]);
}
return ret;
}
void merge_sort(vector<int>& in) {
auto ret = merge_sort(in, 0, in.size());
int i = 0;
for (auto ele : ret) {
in[i++] = ele;
}
}
/** * 快速排序 **/
int devide(vector<int>& in, int beg, int end) {
int pivot = in[beg];
int e = end - 1, b = beg;
while (b < e) {
while (e > b && in[e] >= pivot) e--;
in[b] = in[e];
while (b < e && in[b] < pivot) b++;
in[e] = in[b];
}
in[b] = pivot;
return b;
}
void quick_sort_seg(vector<int>& in, int beg, int end) {
if (beg < end) {
int mid = devide(in, beg, end);
quick_sort_seg(in, beg, mid);
quick_sort_seg(in, mid + 1, end);
}
}
void quick_sort(vector<int>& in) {
quick_sort_seg(in, 0, (int)in.size());
}
/** * 直接插入排序 **/
void insert_sort(vector<int>& in) {
for (int i = 1; i < in.size(); ++i) {
int tmp = in[i];
int j = i - 1;
while (j >= 0 && in[j] > tmp) {
in[j + 1] = in[j];
j--;
}
in[j + 1] = tmp;
}
}
/** * 希尔排序 **/
void shell_sort(vector<int>& in) {
vector<int> steps = {16, 8, 4, 2, 1};
for (auto step : steps) {
for (int i = step; i < in.size(); i += step) {
int tmp = in[i];
int j = i - step;
while (j >= 0 && in[j] > tmp) {
in[j + step] = in[j];
j -= step;
}
in[j + step] = tmp;
}
}
}
/** * 堆排序 **/
int l_child(int parent) {
return ((parent + 1)<<1) - 1;
}
int r_child(int parent) {
return (parent + 1)<<1;
}
void heapify(vector<int>& in, int top, int end) {
if (top >= end) return;
int lc_index = l_child(top);
int rc_index = r_child(top);
if (lc_index >= end) lc_index = top;
if (rc_index >= end) rc_index = top;
int max_index = top;
if (in[lc_index] > in[max_index]) max_index = lc_index;
if (in[rc_index] > in[max_index]) max_index = rc_index;
if (max_index == top) return;
swap(in[max_index], in[top]);
heapify(in, max_index, end);
}
void heap_sort(vector<int>& in) {
for (int i = in.size() / 2; i >= 0; --i) heapify(in, i, in.size());
int len = in.size();
while (len > 0) {
swap(in[0], in[len - 1]);
len -= 1;
heapify(in, 0, len);
}
}
};
int main() {
int n = 0;
cin>>n;
vector<int> data;
for (int i = 1; i <= n; ++i) {
int tmp;
cin>>tmp;
data.push_back(tmp);
}
//sort::count_sort(data);
//sort::radix_sort(data);
//sort::bucket_sort(data);
//sort::merge_sort(data);
//sort::quick_sort(data);
//sort::insert_sort(data);
//sort::shell_sort(data);
sort::heap_sort(data);
for (auto ele : data) cout<<"\t"<<ele;
cout<<endl;
return 0;
}