简单选择排序验证性实验

题目描述 

请创建一个一维整型数组用来存储待排序关键码,关键码从数组下标为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] <<" ";
}

运行结果 

选择排序是一种简单直观的排序算法,它从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小或最大元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

复杂度与稳定性

图片

 

过程介绍(以顺序为例)

  1. 首先设置两个记录i和j,i从数组第一个元素开始,j从(i+1)个元素开始。

  2. 接着j遍历整个数组,选出整个数组最小的值,并让这个最小的值和i的位置交换。

  3. i选中下一个元素(i++),重复进行每一趟选择排序。

  4. 持续上述步骤,使得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;*/
    
    }
} 

 相比冒泡排序的不断交换,简单选择排序是等到合适的关键字出现后再进行交换,并且交换一次就可以达到一次冒泡的效果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿垚啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值