选择排序
其思想是: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
图示:
代码实现:
void swap(int* arr, int num1, int num2)
{
int temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
}
void SelectSort(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
int j = i;
int min = i;
for (; j < size; j++)
{
if (arr[min] > arr[j])
min = j;
}
if (i != min)
swap(arr, min, i);
}
}
直接选择排序理解起来是很简单的,但是他的效率并不是很高,并且直接选择排序是不稳定的。其时间复杂度为O(N^2),空间复杂度为O(1)。
堆排序
堆排序也是选择排序的一种,利用堆这种数据结构的特性来进行的排序,这种排序主要应用于一些大数据我们只关心前10的这种数据,比如Top10的点击量,世界前十富豪,年级前100这样的一部分数据的特性时,选择堆排序来实现。
图示:
代码实现:
void Swap(int* left, int* right)
{
int temp = *left;
* left = *right;
*right = temp;
}
//向下排序
//建立大根堆,最后得到的就是升序序列
void AdjustDwon(int* arr, int size, int parent)
{
//确定该节点的左孩子的位置
int child = parent * 2 + 1;
while (child < size)
{
//找到俩个孩子中最大的孩子
if (child + 1 < size && arr[child] < arr[child + 1])
child += 1;
//检测双亲是否大于最大的孩子
if (arr[parent] < arr[child])
{
Swap(&arr[child], &arr[parent]);
parent = child;
child = parent * 2 + 1;
}
else
return;
}
}
void HeapSort(int* arr, int size)
{
//建堆
for (int root = (size - 2) >> 1; root >= 0; root--)
{
AdjustDwon(arr, size, root);
}
//开始排序
int end = size - 1;
while (end)
{
//交换
Swap(&arr[0], &arr[end]);
//排序
AdjustDwon(arr, end, 0);
end--;
}
}
若要升序则建立大根堆,降序就建立小根堆。
堆排序也是一种不稳定的排序,但是对于一些情况下,堆排序的效率就会高很多,其时间复杂度为O(N*logN),空间复杂度为O(1)。