选择排序实现C++
目录54321
选择排序的简介
选择排序平均时间复杂度O(N^2),还可以进行优化,可以在一次数组遍历中同时找到最大值和最小值,这样就减少了数组的循环次数,效率提高。
选择排序的原理
选择排序(Selection sort)是一种简单直观的排序算法,和冒泡时间复杂度相似。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的开头。以此类推,直到全部待排序的数据元素的个数为零,选择排序是一个最好和最坏都是O(n²)时间复杂度的排序方法,比较的次数与序列的初始状态无关,总的比较次数在都在(n-1) (n-2) (n-3) ... 1 =n * (n-1) / 2次,交换次数为O(n),最好为0,即序列本身有序,最坏为n-1次。
动图演示
【
代码实现
-
-
using namespace std;
-
int a[10000005];
-
int main()
-
{
-
int n;
-
cin>>n;
-
for(int i=1; i<=n; i )
-
cin>>a[i];
-
for(int i=1; i<n; i ){
-
int minIndex = i ;
-
for(int j= i 1 ; j<= n ; j )
-
if(a[j]<a[minIndex])
-
minIndex = j;
-
swap( a[i] , a[minIndex] );
-
}
-
for(int i=1; i<=n; i )
-
cout<<a[i]<<" ";
-
return 0;
-
}
例题
说了这么多,这里有一道例题,
有n个不同的数保存在数组a[1...n]。现在进行n-1轮操作。第1轮就是把a[1]至a[n]当中最小的数交换到a[1]。第2轮就是把a[2]至a[n]当中最大的数交换到a[n],第3轮就是把a[2]至a[n-1]当中最小的数交换到a[2],第4轮就是把a[3]至a[n-1]当中最大的数交换到a[n-1],......按照这个规律,经过n-1轮选择交换后,a数组已经是从小都大排好顺序了。每一轮操作后,你都要输出a数组。
输入/输出例子1
输入:
5
3 5 4 2 1
输出:
1 5 4 2 3
1 3 4 2 5
1 2 4 3 5
1 2 3 4 5
代码
-
#include<bits/stdc .h>
-
using namespace std;
-
int x[1000];
-
int main(){
-
int n;
-
cin>>n;
-
for(int i=1;i<=n;i )
-
cin>>x[i];
-
for(int i=1;i<n;i )
-
{
-
if(i%2==1)
-
{
-
int minid=i;
-
for(int j=i;j<=n;j )
-
if(x[minid]>x[j])
-
minid=j;
-
swap(x[i-i/2],x[minid]);
-
}
-
else
-
{
-
int maxid=i-i/2 1;
-
for(int j=i;j<=n-i/2 1;j )
-
if(x[maxid]<x[j])
-
maxid=j;
-
swap(x[n-i/2 1],x[maxid]);
-
}
-
for(int j=1;j<=n;j )
-
cout<<x[j]<<" ";
-
cout<<endl;
-
}
-
-
return 0;
-
}
补充
为了使我们更好的观察选择排序的过程,下面的程序可以将每轮选择输出。
-
-
using namespace std;
-
int a[105];
-
int main()
-
{
-
int n;
-
cin>>n;
-
for(int i=1; i<=n; i )
-
cin>>a[i];
-
for(int i=1; i<n; i ){
-
int minIndex = i ;
-
for(int j= i 1 ; j<= n ; j )
-
if(a[j]<a[minIndex])
-
minIndex = j;
-
swap( a[i] , a[minIndex] );
-
for(int i=1; i<=n; i )
-
cout<<a[i]<<" ";
-
cout<<endl;
-
}
-
return 0;
-
}
输入:
4
4 1 2 3
输出:
1 4 2 3
1 2 4 3
1 2 3 4
二,优化
由于可以在一次数组遍历中同时找到最大值和最小值,这样就减少了数组的循环次数,效率提高。
但由于怎么做只能把时间复杂度缩小为O((N/2)^2),如果正的要追求更快的时间复杂度的话,可以用快速排序、堆排序、归并排序这些时间复杂度为O(N log N)的算法。优化程序会放到这个专栏的另外一片文章。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiafhbi
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22