题目描述
请创建一个一维整型数组用来存储待排序关键码,关键码从数组下标为1的位置开始存储,下标为0的位置不存储关键码。输入关键码的个数,以及各个关键码,采用简单选择排序的方法对关键码数组进行排序,输出每轮比较的过程。
输入描述
各个命令以及相关数据的输入格式如下:
第一行输入关键码的个数n
第二行输入n个整型关键码
输出描述
输出关键码比较过程,输出经比较需要移动的关键码,每轮一行,关键码之间以空格隔开,最后一个关键码后有空格,然后回车,不重复输出,不输出空行,最后输出排好序的所有关键码,以空格隔开。
输入样例
10 2 5 9 8 7 4 3 10 16 13
输出样例
4 3 8 7 4 7 5 8 13 2 3 4 5 7 8 9 10 13 16
#include<iostream>
using namespace std;
int main()
{
int n,j;
cin>>n;
int data[n+1];
for(int i = 0 ; i < n ; i++)//关键码的录入
{
cin>>data[i];
}
int temp,index,flag;
for(int i = 0; i < n-1; i++)//进行n-1趟简单排序
{
index=i,flag=0;
for(j = i + 1; j < n; j++) //在无序区选取最小值
{
if(data[j] < data[index])
{
index = j;//保留最小关键码的下标
cout << data[j] <<" ";//输出经比较需要移动的关键码
flag=1;
}
}
if(index != i)
{
temp = data[i];
data[i] = data[index];
data[index] = temp;
}
if(flag == 1)//当每趟输出为非空情况输出换行
cout << endl;
}
for(int i = 0 ;i < n; i++)//输出排好序的所有关键码
cout << data[i] <<" ";
}
运行结果
选择排序是一种简单直观的排序算法,它从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小或最大元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
复杂度与稳定性
过程介绍(以顺序为例)
-
首先设置两个记录i和j,i从数组第一个元素开始,j从(i+1)个元素开始。
-
接着j遍历整个数组,选出整个数组最小的值,并让这个最小的值和i的位置交换。
-
i选中下一个元素(i++),重复进行每一趟选择排序。
-
持续上述步骤,使得i到达(n-1)处,即完成排序 。
图示过程:
以数据{2,10,9,4,8,1,6,5}为例
如图所示,每次交换的数据使用红颜色标记出,已经排好序的数据使用蓝底标注,
每一趟从待排序的数据元素中选出最小的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
我们只需要进行n-1趟排序即可,因为最后剩下的一个数据一定是整体数据中最大的数据。
void select(int a[],int n){
int temp,index;
for(int i=0;i<n-1;i++){
index=i; //利用一个中间变量temp来记录需要交换元素的位置
for(int j=i+1;j<n;j++){
if(a[index]>a[j]){ //选出待排数据中的最小值
index=j;
}
}
swap(a[i],a[index]); //交换函数
/*temp = data[i];
data[i] = data[index];
data[index] = temp;*/
}
}
相比冒泡排序的不断交换,简单选择排序是等到合适的关键字出现后再进行交换,并且交换一次就可以达到一次冒泡的效果。