for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
选择排序的步骤
- 第一轮 :
- 遍历整个数组找到最小值,并将其与第一个元素交换。
- 第二轮 :
- 从第二个元素开始遍历剩余的部分找到最小值,并将其与第二个元素交换。
- 继续进行 :
- 重复上述过程,直到剩下最后一个元素不需要再进行任何比较和交换。
在最后一轮中,只剩下两个元素,倒数第二个元素与最后一个元素进行比较,确定了它们的位置。
示例
假设有一个数组
[1, 9, 0, 3, 4, 5, 6, 7]
。
- 第1轮(i = 0):找到最小值
0
,将其与第一个元素1
交换,结果为[0, 9, 1, 3, 4, 5, 6, 7]
。- 第2轮(i = 1):找到剩余部分最小值
1
,将其与第二个元素9
交换,结果为[0, 1, 9, 3, 4, 5, 6, 7]
。- 第3轮(i = 2):找到剩余部分最小值
3
,将其与第三个元素9
交换,结果为[0, 1, 3, 9, 4, 5, 6, 7]
。- 依此类推,直到第7轮(i = 6):找到剩余部分最小值
6
,将其与倒数第二个元素9
交换,结果为[0, 1, 3, 4, 5, 6, 7, 9]
。到此为止,数组已经有序,而最后一个元素
9
自动成为最大值。
外层循环for(i=0;i<len-1;i++)
确定当前循环的位置
循环条件是i<len-1
是因为在选择排序的每一轮中,把一个元素放在它最终的位置上。到达最后一轮时,倒数第二个位置将自动成为最大的元素,所以最后一个位置的元素已经是有序的,不再需要进行比较和交换。
i < len - 1
是为了保证每一轮排序中都能找到一个未排序部分的最小值并将其放在正确的位置,避免对最后一个元素进行多余的比较和交换。
内层循环for(j=i+1;j<len;j++)
进行比较和数据交换
在选择排序算法的实现中,内层循环的条件 j = i + 1; j < len; j++
是为了找到当前未排序部分中的最小值,并将其与当前元素交换。
-
j = i + 1 :内层循环的起始索引
j
从i + 1
开始,这是因为在选择排序的第i
轮中,我们假设第i
个元素是当前未排序部分中的最小值,然后从第i + 1
个元素开始遍历剩余未排序的元素来找到真正的最小值。如果从i
开始,会无意义地与自身进行比较。 -
j < len :内层循环的终止条件是
j
小于数组长度len
,即内层循环会遍历到数组的最后一个元素,确保比较到每一个未排序的元素。
通过这样的设计,选择排序确保每一轮都能找到当前未排序部分中的最小值,并将其放到正确的位置。