直接选择排序和堆排序都属于选择排序
ps:仍以升序为例!
一、直接选择排序
直接选择排序的思想:
选择排序就是通过n-i次关键字的比较,每次从n-i+1个记录中找出最小的关键字,将其与第i个位置的数据交换。
void SelectSort(int* a, size_t size)
{
assert(a);
int max = 0;
for (size_t i=0; i<size; ++i)
{
max = i;
for (size_t j=i+1; j<size; ++j)
{
if (a[j] > a[max])
{
max = j;
}
}
if (i != max)
swap(a[i],a[max]);
}
}
直接选择排序的优化:
上边简单的选择排序是每次选出一个数来交换,优化后的做法是从数组的两边开始遍历,每次选出一个最大的数一个最小的数来进行交换
void SelectSort(int* a,int size)
{
assert(a);
int left = 0;
int right = size-1;
while(left < right)
{
int min = left;
int max = left;
//在[left,right]区间内找最大最小
for (int i=left; i<=right; ++i)
{
if (a[i] < a[min])
min = i; //找到[left,right]内最小值的下标
if (a[i] > a[max])
max = i; //找到[left,right]内最大值的下标
}
swap(a[left],a[min]); //将最小值放在区间最左边
if (left &