插入排序
- 时间复杂度:
- 最好情况O(n):数组有序
- 最坏情况O(n2):数组完全逆序
- 平均情况O(n2)
- 空间复杂度:没有随着输入规模的增长而动态分配额外的空间,所以空间复杂度为O(1)
- 稳定性:稳定的排序算法
void insertSort(vector<int> &v) {
int n = v.size();
for (int i = 1; i < n;i++) {
int j = i - 1;
int temp = v[i];
for (; j >= 0; j--) {
if (v[j] > temp) {
v[j + 1] = v[j];
}
else {
break;
}
}
v[j + 1] = temp;
}
}
插入排序优化
void insertSort(vector<int> &v) {
int n = v.size();
for (int i = 1; i < n; i++) {
int temp = v[i];
int left = 0, right = i - 1;
// 二分查找插入位置
while (left <= right) {
int mid = left + (right - left) / 2;
if (v[mid] > temp) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
// 移动元素腾出插入位置
for (int j = i - 1; j >= left; j--) {
v[j + 1] = v[j];
}
v[left] = temp;
}
}
计数排序(桶排序)
- 时间复杂度:O(n)
- 空间复杂度:没有随着输入规模的增长而动态分配额外的空间,所以空间复杂度为O(1)
- 稳定性:稳定的排序算法
int maxval(vector<int>& v) {
int n = v.size();
int max = v[0];
for (int i = 1; i < n;i++) {
if (v[i] > max) {
max = v[i];
}
}
return max;
}
void bucketsort(vector<int>& v) {
int n = v.size();
int max = maxval(v);
vector<int>bucket(max + 1);
for (int i = 0; i < n; i++) {
bucket[v[i]]++;
}
int index = 0;
for (int i = 0; i < max + 1; i++) {
while (bucket[i]--) {
v[index++] = i;
}
}
}
计数排序优化
int maxval(vector<int>& v) {
return *std::max_element(v.begin(), v.end());
}
void bucketsort(vector<int>& v) {
int n = v.size();
int minVal = *std::min_element(v.begin(), v.end());
int maxVal = *std::max_element(v.begin(), v.end());
vector<int> bucket(maxVal - minVal + 1);
for (int i = 0; i < n; i++) {
bucket[v[i] - minVal]++;
}
int index = 0;
for (int i = 0; i < maxVal - minVal + 1; i++) {
while (bucket[i]--) {
v[index++] = i + minVal;
}
}
}