选择排序
选择排序( Selection sort)是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
代码实现:
void SelectSort(int* a, int n)
{
int begin = 0, end = n - 1;
while (begin < end)
{
int maxi = begin, mini = begin;//选出最大最小值下标
for (int i = begin + 1; i <= end; i++)
{
if (a[i] > a[maxi])
maxi = i;
if (a[i] < a[mini])
mini = i;
}
Swap(&a[mini], &a[begin]);
if (maxi == begin)
Swap(&a[mini], &a[end]);
else
Swap(&a[maxi], &a[end]);
begin++;
end--;
}
}
性能分析:
时间复杂度明显为
O
(
N
2
)
O(N^2)
O(N2),值得注意的是当数组为顺序有序时,时间复杂度依然为
O
(
N
2
)
O(N^2)
O(N2)。
堆排序
堆排序(Heap sort)将待排序的序列构建成一个大顶堆或小顶堆,然后依次取出堆顶元素,再调整堆使得剩余元素重新满足堆的性质,直到所有元素都被取出,就得到了一个有序序列。
代码实现:
//排升序,建大堆
void AdjustDwon(int* a, int n, int root)
{
int parent = root;
//左孩子
int child = parent * 2 + 1;
while (child < n)
{
//判断左右孩子大小
if (child + 1 < n && a[child + 1] > a[child])
child++;
if (a[parent] > a[child])
{
break;
}
else
{
Swap(&a[parent], &a[child]);
parent = child;
child = parent * 2 + 1;
}
}
}
void HeapSort(int* a, int n)
{
for (int i = (n-2)/2; i >= 0; i--)
{
//向下调整建堆
AdjustDwon(a, n - i, i);
}
for (int i = 0; i < n - 1; i++)
{
Swap(&a[0], &a[n - i - 1]);
AdjustDwon(a, n - i - 1, 0);
}
}
性能分析:
堆排序的时间复杂度为
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)是一个性能非常好的排序算法,最好的情况是顺序有序,此时时间复杂度为
O
(
N
)
O(N)
O(N)。