选择排序
从序列中依次选出最小值(或者最大值)放在一侧。这样的排序叫选择排序。
这里我们对选择排序进行优化,一次就选出当前序列的最大值和最小值。分别放在最右端和最左端。然后left++,
right--。使得序列范围缩小,再进行选择最大和最小值。
void SelectSort(int*a, int n)// 3选择排序
{
int left = 0;
int right = n;
int min = left;
int max = right - 1;
while (left<right)
{
int min = left;
int max = right - 1;
for (int i = left; i < right; ++i)
{
if (a[i] < a[min])
{
min = i;
}
if (a[i]>a[max])
{
max = i;
}
}
swap(a[left], a[min]);
if (max == left)
{
max = min;
}
swap(a[right-1], a[max]);
++left;
--right;
}
}
选择排序任何情况下时间复杂度都是O(N^2),但它是稳定的一种排序算法。
如果要从小到大的序列。则我们需要建立大堆-->取堆的TOP和堆最后一个数据交换(最大的数放在了最后面)--->因为交换之后,不再是大堆,进行向下调整算法,继续是大堆---->循环取TOP和最后数交换
void AdjustDown(int* a, int i,int n)// 4 -向下调整算法
{
int parent = i;
int child = i * 2 + 1;
while (child < n)
{
if (child + 1 < n&&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 Heap(int*a, int n)//4 堆排序
{
int i = (n - 2)/2;
for (i; i >= 0; --i)
{
AdjustDown(a, i, n);
}
int end=n-1;
while (end)
{
swap(a[0], a[end]);
AdjustDown(a, 0, end);
--end;
}
}
堆排的时间复杂度是N*logN,是不稳定的排序。