简单选择排序是一种直观且易于实现的排序算法。它的基本思路是:每次选择未排序部分的最小(或最大)元素,将其放到已排序部分的末尾。
简易代码描述:
代码一:
void selectionSort(int a[], int n)
{
int i, j, minIndex, temp;
// 从数组的开始到倒数第二个元素(因为最后一个元素在前面已经排好序)
for (int k = 0; k < n - 1; k++)
{
// 假设当前索引 k 的元素是未排序部分的最小值
minIndex = k;
// 查找未排序部分的最小值
for (j = k + 1; j < n; j++)
{
if (a[j] < a[minIndex])
minIndex = j;
}
// 如果最小元素不是当前位置的元素,进行交换
if (minIndex != k)
{
temp = a[k];
a[k] = a[minIndex];
a[minIndex] = temp;
}
}
}
代码分析:
- 外层循环:
for (int k = 0; k < n - 1; k++)
从数组的开始到倒数第二个元素。因为每次迭代后,k
位置的元素都会是已排序部分的最后一个元素。 minIndex
:在每次外层循环开始时,假设当前位置k
的元素是未排序部分的最小值。- 内层循环:
for (j = k + 1; j < n; j++)
从k + 1
开始,查找未排序部分的最小值。 - 交换:如果
minIndex
不等于k
,则交换k
位置的元素与找到的最小值的位置,以保证每次外层循环结束时k
位置的元素是未排序部分的最小值。
代码二:
void selectionSort(int a[], int n)
{
int i, j, k, temp;
// 从数组的末尾到数组的第一个元素进行迭代
for (k = n - 1; k > 0; k--)
{
// 初始化i为当前未排序部分的第一个元素索引
i = 0;
// 查找未排序部分中最大的元素
for (j = 0; j <= k; j++)
{
if (a[j] > a[i])
i = j; // 更新最大值的索引
}
// 交换当前最大的元素与未排序部分的最后一个元素
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
代码解释:
- 外层循环:
for (k = n - 1; k > 0; k--)
从数组的末尾向前遍历,逐步缩小未排序部分的范围。 - 内层循环:
for (j = 0; j <= k; j++)
在未排序部分查找当前最大值的索引。 - 交换:将找到的最大值与当前未排序部分的最后一个元素交换位置。