选择排序是每一次从待排序的数据元素中找出最小的(或最大的)一个元素,放在序列的起始位置,然后,再从剩余元素中继续寻找最小(大)的元素,依次放在已排序序列的末尾,最终实现排序。
举一个简单例子
现有5个元素:9,2,5,7,6 对它进行排序,按从小到大排列
第一趟排序进行的过程
元素值 | 9 | 2 | 5 | 7 | 6 |
位置标号 | ① | ② | ③ | ④ | ⑤ |
首先比较位置①和位置②元素的大小 ,9>2,则两者交换位置
2 | 9 | 5 | 7 | 6 |
比较位置①和位置③元素的大小,2<5,不用交换位置
2 | 9 | 5 | 7 | 6 |
比较位置①和位置④元素的大小,2<7,不用交换位置
2 | 9 | 5 | 7 | 6 |
比较位置①和位置⑤元素的大小,2<6,不用交换位置
2 | 9 | 5 | 7 | 6 |
此时元素2 已经被确认为整个数组中值最小的一个,位置已经确定不用再改动
第二趟排序进行的过程
元素值 | 2 | 9 | 5 | 7 | 6 |
位置标号 | ① | ② | ③ | ④ | ⑤ |
比较位置②和位置③元素的大小,9>5,则交换位置
2 | 5 | 9 | 7 | 6 |
比较位置②和位置④元素的大小,5<7,不用交换位置
2 | 5 | 9 | 7 | 6 |
比较位置②和位置⑤元素的大小,5<6,不用交换位置
2 | 5 | 9 | 7 | 6 |
此时元素5被确认为数列中第二小的元素 ,位置确定
第三趟排序进行的过程
元素值 | 2 | 5 | 9 | 7 | 6 |
位置标号 | ① | ② | ③ | ④ | ⑤ |
比较位置③和位置④元素的大小,9>7,则交换位置
2 | 5 | 7 | 9 | 6 |
比较位置③和位置⑤元素的大小,7>6,则交换位置
2 | 5 | 6 | 9 | 7 |
此时元素6被确认为数列中第三小的元素 ,位置确定
第四趟排序进行的过程
元素值 | 2 | 5 | 6 | 9 | 7 |
位置标号 | ① | ② | ③ | ④ | ⑤ |
比较位置④和位置⑤元素的大小,9>7,则交换位置
2 | 5 | 6 | 7 | 9 |
至此,元素已经按照我们的要求按顺序排列完毕
我们可以发现总共需要进行(元素个数-1)趟排序就可以完成顺序排列。
编写程序如下(利用程序产生的一组随机数进行验证)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> vec;
int x;
cout << "please enter a number max,and computer get a rand number between 0-max: ";
cin >> x;
for (int i = 0; i < x; ++i)
{
vec.push_back(rand());
}
cout << "before sort vector elements: " << endl;
for (auto c : vec)
{
cout << c << " ";
}
cout <<"\n\n\n\n\n";
auto max=max_element(vec.begin(), vec.end());
auto min = min_element(vec.begin(), vec.end());
cout << "The max element in vec is : " << *max << endl;
cout << "The min element in vec is: " << *min << endl;
int ss = vec.size();
for (int i = 0; i < ss - 1; i++)
{
for (int j = i + 1; j < ss; j++)
{
if (vec[i] > vec[j])
{
int temp = vec[i];
vec[i] = vec[j];
vec[j] = temp;
}
}
}
cout << "-------------------------------------------------------" <<
"--------------------------------------------------------" <<
"------------------------------------------------------------" <<
"---------------------------------------------------------------------";
cout << "after sort vector elements: " << endl;
for (auto c:vec)
{
cout << c << " ";
}
return 0;
}
程序运行结果如下
也可以向其中输入重复元素检验其排序效果