如上数组
选择排序的实现条件就是设置两个指针(次指针不是数据类型的指针而是int类型的值指向数组的下标)两个指针从最左端开始向右遍历,遍历结束一个指针指向该数组最大的值一个指针指向数组最小的值,将最大的值与与数组最右端的数据交换,将最小的值与数组最左端数据交换。
交换完了之后数组两端之后不再移动忽略两端
将剩下的数组循环上述操作
一直到最右端和最左端都是同一个数组元素停止操作
此时数组已完成排序
这种方式还存在一些bug
那就是当这种情况时
最大的数在最左端max指针不移动,如果将最小的数与最左端的数交换,那么max指向的数值将会发生改变,那么最右端将不会是最大值而是最小值,排序存在BUG。
当出先这种情况时我们需要设立一个特殊情况时的特殊处理。
当,max指向数组最左端时,我们将min指向的值与最右端的值交换,再将最右端的值与最左端的值交换,这样便修复了BUG。
代码实现
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void SelectSort(int* a, int n)
{
int left = 0, right = n - 1;
while (left < right)
{
int min = left;
int max = left;
for (int i = left; i <= right; i++)
{
if (a[i] > a[max])
{
max = i;
}
else if (a[i] < a[min])
{
min = i;
}
}
if (max == left)
{
swap(&a[min], &a[right]);
swap(&a[left], &a[right]);
}
else
{
swap(&a[min], &a[left]);
swap(&a[max], &a[right]);
}
left++;
right--;
}
}