1. 简单选择排序
(1)算法思想:将序列的第一个元素当作最小的元素,和后面的元素一一比较,将最小的元素下标标记出来,和第一个元素进行交换,则一趟下来,第一个元素一定是最小的,直到所有的元素全部排序完成。
(2)基本实现:
void SelectSort(DataType* arr, int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
int key = arr[i];
int k = i;
for (j = i + 1; j < sz - 1; ++j)
{
if (arr[j] < arr[k])
k = j;
}
if (k != i)
{
swap(arr[k], arr[i]);
}
}
}
(3)算法性能:
时间复杂度: O(n^2)
空间复杂度:O(1)
稳定性:不稳定
2. 堆排序
(1)算法思想:
将一个无序序列先构建成堆,再利用自上向下进行调整。
(2)基本实现:
void CreateHeap(DataType* arr, int sz)
{
size_t root = (sz - 2) >> 1;
for (; root >= 0; root--)
{
Adjust(arr, sz, root);
}
//堆排序
size_t end = sz - 1;
while (end)
{
swap(arr[0], arr[end]);
Adjust(arr, end, 0);
end--;
}
}
void Adjust(int*arr, int sz, size_t parent)
{
size_t Child = parent * 2 + 1;
while (Child < sz)
{
if (Child + 1 < sz&&arr[Child + 1] > arr[Child])
Child = Child + 1;
if (arr[Child]>arr[parent])
{
swap(arr[Child], arr[parent]);
parent = Child;
Child = parent * 2 + 1;
}
else
break;
}
}
(3)算法性能:
时间复杂度:O(n logn);
空间复杂度:O(1);
稳定性:稳定