目录
一.选择排序
1.基本概念:
1.
基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。
2.直接选择排序
:
在元素集合
array[i]--array[n-1]
中选择关键码最大
(
小
)
的数据元素
若它不是这组元素中的最后一个
(
第一个
)
元素,则将它与这组元素中的最后一个(第一个)元素交换
在剩余的
array[i]--array[n-2]
(
array[i+1]--array[n-1]
)集合中,重复上述步骤,直到集合剩余
1
个元素。
2.实现分析:
void SelectSort(int* a, int n)
{
int begin = 0, min = 0;
for (int i = 0;i < n - 1;i++)
{
min = i;
for (int j = i;j <n ;j++)
{
if (a[min] > a[j])
{
min = j;
}
}
swap(&a[min], &a[begin]);
begin++;
}
}
以上是定义了一个找最小值的下标min,可以优化成定义一个min,一个max,小的放左边,大的放右边
void SelectSort(int* a, int n)
{
int head = 0, end = n - 1;
while (head < end)
{
int min = head, max = head;
for (int i = head+1;i <= end;i++)
{
if (a[min] > a[i])
{
min = i;
}
if (a[max] < a[i])
{
max = i;
}
}
swap(&a[min], &a[head]);
if (max == head)
{
max = min;
}
swap(&a[max], &a[end]);
head++;
end--;
}
}
3.特征及复杂度:
1.
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2.
时间复杂度:
O(N^2)
3.
空间复杂度:
O(1)
4.
稳定性:不稳定
二:堆排序
1.基本概念:
堆排序
(Heapsort)
是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。
需要注意的是排升序要建大堆,排降序建小堆。
2.实现分析:
void swap(int* end, int* tmp)
{
int sum = *end;
*end = *tmp;
*tmp = sum;
}
void down(int* a, int size, int parent)// 向下取整
{
assert(a);
int child = parent * 2 + 1;
while (child < size)
{
if (child + 1 < size && a[child + 1] > a[child])
{
child++;
}
if (a[child] > a[parent])
{
swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void HeadSort(int* a, int n)
{
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
down(a, n, i);
}
int end = n - 1;
while (end > 0)
{
swap(&a[0], &a[end]);
// 再调整,选出次小的数
down(a, end, 0);
--end;
}
}
3.特征及复杂度:
1.
堆排序使用堆来选数,效率就高了很多。
2.
时间复杂度:
O(N*logN)
3.
空间复杂度:
O(1)
4.
稳定性:不稳定