基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

算法实现:(杭电ACM 1040) 验证 结果AC啦

#include<iostream>
using namespace std;
const int N =;
void sort(int a[],int num);
void print(int a[],int num);
void swap(int &a,int &b);
int main()
{
int s[N];
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int j=;j<n;j++)
cin>>s[j];
sort(s,n);
print(s,n);
cout<<endl;
}
return ;
}
void sort(int a[],int num)//选择排序代码
{
for(int i=;i<num;i++)
{
int k=i;
for(int j=i+;j<num;j++)
{
if(a[k]>a[j])//从剩下的元素选择一个最小的元素
k=j;
}
if(k!=i)
{
swap(a[k],a[i]);//与最小的元素进行交换
} }
}
void swap(int &a,int& b)//交换元素
{
int temp;
temp=a;
a=b;
b=temp;
}
void print(int a[],int n)//输出数组元素
{
cout<<a[];
for(int k=;k<n;k++)
{
cout<<" "<<a[k];
}
}

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:

#include<iostream>
using namespace std;
const int N =;
void SelectSort(int a[],int );
void print(int a[],int num);
void swap(int &a,int &b); int main()
{
int s[N];
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int j=;j<n;j++)
cin>>s[j];
SelectSort(s,n);
print(s,n);
cout<<endl;
}
return ;
}
void SelectSort(int arr[],int size)
{
int minIndex, maxIndex;
for (int i = ; i < size / ; i++) {
minIndex = i;
maxIndex = size-i-;
for (int j = i; j < size - i ; j++) { if (arr[j] > arr[maxIndex]) {
maxIndex = j;
//continue;
}
if (arr[j] < arr[minIndex]) {
minIndex = j; } }
if (maxIndex == i && minIndex == size - i - ) {
//特殊交换位置一,当最大的交换位置和最小的交换位置都在最前面和最后面
swap(arr[maxIndex],arr[minIndex]);
}
else if (maxIndex == i) {
//特殊交换位置二,当最大的交换位置是最前面
// Swap(arr[n - i], arr[maxIndex])
swap(arr[size-i-],arr[maxIndex]); swap(arr[i], arr[minIndex]);
}
else if (minIndex == size - i - ) {
//特殊交换位置三,当最小的交换位置是最后面
swap(arr[i], arr[minIndex]);
swap(arr[size - i-], arr[maxIndex]);
}
else {
//除了上面三种特殊交换,就剩普通交换了,普通交换随便哪个先交换都行
swap(arr[i], arr[minIndex]);
swap(arr[size - i-], arr[maxIndex]) ;
}
}
}
void swap(int &a,int& b)//交换元素
{
int temp;
temp=a;
a=b;
b=temp;
}
void print(int a[],int n)//输出数组元素
{
cout<<a[];
for(int k=;k<n;k++)
{
cout<<" "<<a[k];
}
}

最新文章

  1. jQuery下拉框插件8种效果
  2. Uva11300 Spreading the Wealth
  3. SimpleUrlHandlerMapping 使用
  4. TCP/IP协议原理与应用笔记16:交换机和路由器区别
  5. java构造器执行顺序一个有趣的简单实例
  6. beta版本复审
  7. Asp.Net Core 轻松学-多线程之取消令牌
  8. Xapian的内存索引-添加文档
  9. 【配置阿里云 I】申请配置阿里云服务器,并部署IIS和开发环境,项目上线经验
  10. frist Django app — 四、 完善View
  11. Paper | 亚像素运动补偿 + 视频超分辨
  12. Luogu3297 SDOI2013逃考(半平面交+最短路)
  13. 【NOIP 2016】Day2 T3 愤怒的小鸟
  14. [剑指Offer]34-二叉树中和为某一值的路径
  15. Netty实践
  16. [Automation] 自动化测试工具和测试框架大集合
  17. unable to locate package
  18. 页面livereload width grunt
  19. 后端编程语言PHP
  20. SQL学习笔记之B+树

热门文章

  1. MySQL-profiling的使用
  2. 学习OpenCV——OpenMP
  3. Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作
  4. 使用opencv显示视频的方法
  5. PHP判断手机号码是否合法
  6. js字符串转化为方法调用
  7. [原创]spring学习笔记:关于springsource-tool-suite插件的安装
  8. js this 闭包
  9. zw版【转发&#183;台湾nvp系列例程】halcon与delphi系列例程
  10. 【linux】自定义配置debian+openbox