内容:简单选择排序的代码实现及注解,思路详解
目录
代码实现:
交换函数:
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
简单选择排序函数:
void SelectSort(int* a, int n)
{
int begin = 0;
int end = n - 1;
while (begin < end)
{
int mini = begin;//记录最小值的下标
int maxi = begin;//记录最大值的下标
int i = 0;
for (i = begin; i <= end; i++)//遍历一遍区间,找出最小值和最大值的下标
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i] > a[maxi])
{
maxi = i;
}
}
Swap(&a[begin], &a[mini]);//将最小值交换到区间的起始位置
if (begin == maxi)//若是begin和maxi重叠,需要更新以下maxi的值
{
maxi = mini;
}
Swap(&a[end], &a[maxi]);//将最大值交换到区间的末尾位置
begin++;//缩小区间
end--;
}
}
思路详解:
1 一层循环用来逐步缩小区间,当区间缩小到只有1个元素时循环结束,因为区间缩减到仅剩1个元素,那这个元素肯定也是占到最终位置的,所有无需进行排序了,整个数组有序了
2 对于每个区间:
a 遍历一遍,找出区间中的最小值和最大值的下标
b 将最小值交换到此区间的起始位置,将最大值交换到此区间的末尾位置
注意区间的起始位置begin和最大值下标maxi重叠的情况,此时我们是先将最小值与区间起始位置交换,那么最大值被交换到了原本最小值的位置,那么我们需要更新最大值下标的值,以便正确将最大值交换到区间的末尾位置
3 区间缩减:
begin++
end--
完结撒花~