算法原理
(假设这些数字在排队)
1.首先从这个队伍中找出值最大(小)的数字 放在队首
此时想象把队伍分成两组
一组有序 即刚刚找出的那个数字
一组无序 即除了队首的那个数字
2.然后开始从无序的那组队伍开始寻找最大(小)的数字
一旦找到就放到刚刚有序队伍的队尾
以此类推直至所有数字都排序完毕
整体思路
我们可以看出选择排序的整体思路就是 从无序队列中找出最大(小)的数字放到有序队列的队尾 有序队列一直在扩充,无序队列一直在减少直至排序完毕
代码如下
void select_sort(int* src, int size) {
for (int i = 0;i < size-1;i++) {
int Max = i; //刚开始时将i的值赋给了Max
for (int j = i + 1;j < size;j++) {
if (src[Max] < src[j]) { //如果比较出来了下标为j的元素的值大于下标为Max的元素的值
Max = j; //就将j赋值给Max
}
}
if (Max != i) { //如果Max不等于i则说明第i大的数字不在第i大的位置上 所以要交换
int tmp = src[Max];
src[Max] = src[i];
src[i] = tmp;
}
}
}
部分代码分析
int Max = i; //刚开始时将i的值赋给了Max
for (int j = i + 1;j < size;j++) {
if (src[Max] < src[j]) { //如果比较出来了下标为j的元素的值大于下标为Max的元素的值
Max = j; //就将j赋值给Max
}
}
这段代码就相当于在找最大的那个数的下标
if (Max != i) { //如果Max不等于i则说明第i大的数字不在第i大的位置上 所以要交换
int tmp = src[Max];
src[Max] = src[i];
src[i] = tmp;
}
这段代码就是说 在第二个for循环结束后 找到了最大值得下标 如果下标不等于i [i,size) 就将这个两个下标的元素互换