冒泡排序#
void bubble_sort(int arr[], int length)
{
for(int i = 0; i < length; ++i)
{
for(int j = 0; j < length - i - 1; ++j)
{
if(arr[j] > arr[j + 1])
{
arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
}
}
}
}
时间复杂度 |
空间复杂度 |
稳定性(能否保持两个符合条件的元素间的位置关系) |
O(N²) |
O(1) |
√ |
选择排序#
void select_sort(int arr[], int length)
{
for(int i = 0; i < length; i++)
{
int k = i;
for (int j = i + 1; j < length; j++)
{
if (arr[k] > arr[j])
k = j;
}
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
时间复杂度 |
空间复杂度 |
稳定性 |
O(N²) |
O(1) |
√ |
插入排序#
void insert_sort(int arr[], int length)
{
for(int i = 0; i < length; i++)
{
int key = arr[i];
int j = i - 1;
while(j >= 0 && (arr[j] > key))
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
最外层的每次遍历都是取当前下标的元素作为待插入的值,然后依次与前面的数组中的元素进行比较,决定当前元素的插入位置。
时间复杂度 |
空间复杂度 |
稳定性 |
O(N²) |
O(1) |
√ |
快速排序#
void quick_sort(int arr[], int left, int right)
{
if(left >= right)
return;
int base = arr[right];
int left_guard = left;
int right_guard = right;
while (left_guard <= right_guard)
{
if(left_guard == right_guard)
break;
while(arr[left_guard] < base && left_guard < right_guard)
++left_guard;
while(arr[right_guard] >= base && right_guard > left_guard)
--right_guard;
int temp = arr[left_guard];
arr[left_guard] = arr[right_guard];
arr[right_guard] = temp;
}
arr[right] = arr[right_guard];
arr[right_guard] = base;
quick_sort(arr, left, left_guard - 1);
quick_sort(arr, right_guard + 1, right);
}
快排是通用排序里相对较好的排序算法,使用到了“二分法”这种分治的思想,大大加速了排序的时间,后面的归并排序也体现了分治的思想。
时间复杂度 |
空间复杂度 |
稳定性 |
O(N*log(N)) |
O(logN) |
× |
归并排序#
void merge(int arr[], int left, int mid, int right)
{
if(left >= right)
return;
const int SIZE = right - left + 1;
int arr_copy[10];
int lbegin = left;
int lend = mid;
int rbegin = mid + 1;
int rend = right;
int num = 0;
while(lbegin <= lend && rbegin <= rend)
arr_copy[num++] = arr[lbegin] <= arr[rbegin]? arr[lbegin++]:arr[rbegin++];
while(lbegin <= lend)
arr_copy[num++] = arr[lbegin++];
while(rbegin <= rend)
arr_copy[num++] = arr[rbegin++];
for(int i = 0; i < SIZE; ++i)
arr[left + i] = arr_copy[i];
}
void merge_sort(int arr[], int left, int right)
{
if(left >= right)
return;
int mid = left + (right - left)/2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
归并排序和快排具有相同的时间复杂度和空间复杂度,并且都体现了分治的思想,不过,归并排序的优势不仅在排序算法本身上,这种划分的方法更可以扩展到并行计算上,从而可以借助多个线程达到更快的排序速度。
时间复杂度 |
空间复杂度 |
稳定性 |
O(N*log(N)) |
O(logN) |
√ |
堆排序#
void heap_sort(int arr[], int length)
{
for (int i = length / 2 - 1; i >= 0; i--)
heapify(arr, i, length - 1);
for(int i = length - 1; i > 0; i--)
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapify(arr, 0, i - 1);
}
}
void heapify(int arr[], int begin, int end)
{
int headnode = begin;
int subnode = headnode * 2 + 1;
while(subnode <= end)
{
if((subnode + 1) <= end && arr[subnode + 1] > arr[subnode])
subnode++;
if(arr[subnode] > arr[headnode])
{
int temp = arr[subnode];
arr[subnode] = arr[headnode];
arr[headnode] = temp;
headnode = subnode;
subnode = headnode * 2 + 1;
}
else
return;
}
}
堆排序是二叉堆的一种应用,形成大根堆或者小根堆的过程,天然保证了根是最大或最小的,排序的过程也就是不断将数组进行堆化的过程。
.
时间复杂度 |
空间复杂度 |
稳定性 |
O(N*log(N)) |
O(1) |
× |
桶排序#
int maxbit(int arr[], int length)
{
int maxbt = arr[0];
for(int i = 1; i < length; i++)
{
if(maxbt < arr[i])
maxbt = arr[i];
}
int d = 1;
while ((maxbt / d) != 0)
{
d *= 10;
}
d /= 10;
return d;
}
void radix_sort(int arr[],int length)
{
int d = maxbit(arr, length);
std::queue<int> bocket[10];
for(int i = 1; i <= d; i *= 10)
{
for(int j = 0; j < length; j++)
bocket[arr[j] % i].push(arr[j]);
for(int j = 0; j < length; j++)
{
int num = 0;
while(!bocket[j].empty())
{
arr[num++] = bocket[j].front();
bocket[j].pop();
}
}
}
}
桶排序区别与通用的排序方法,它不是根据元素的比较进行排序的,而是根据要排序元素的某些特性设计出来的。比如上述这个排序方法就是按照数字的各个数位上的值放入不同的桶中,执行常数轮后,再拿出来的数组就已经是排好序的了。这种非比较的特性决定了桶排序不是一种通用的排序算法,但是如果能找到要排序元素的某个顺序性质后,桶排序无疑是能得到极快的排序速度。
时间复杂度 |
空间复杂度 |
稳定性 |
O(N) |
O(N) |
- |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)