算法-蛮力法-选择排序

1.选择排序原理

选择排序第i趟排序从第i个记录开始扫描序列,在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。

 2.伪代码

算法3.6——选择排序
     void SelectSort(int r[ ], int n)  //数组下标从1开始
    {   
       for (i=1; i<=n-1; i++)   //对n个记录进行n-1趟简单选择排序
       {  
          index=i; 
          for (j=i+1; j<=n; j++)   //在无序区中找最小记录
            if (r[j]<r[index]) index=j;
          if (index!=i) r[i]←→r[index];  //若最小记录不在最终位置则交换
       }
    }

3.举例

按照从大到小的顺序排列这五个数字:4 9 2 6 8

index是这一趟比较过程中最小的数的位置下标,每趟首次比较将开始比较的第一个数设置成最小数

每次比较r[index]和r[j],就是按顺序和最小数相比,如果有比当前最小的数还小的数,就改变index的值为这个数的位置下标

在找完这一趟的最小数的位置下标后,把这一趟的最小数放在这一趟开始比较的第一个的位置上,比如在第一趟(i=0,从位置下标为0处开始比较)比较中发现了2是最小的数,就把2放在位置下表是0的位置上。

  • 第一趟 i=0时     初始数组{4 9 2 8 6}
    • j=1  index=i=0, {4 9 2 8 6}  4<9, index不变   
    • j=2  index=0,    {4 9 2 8 6}  4>2, index-> 
    • j=3  index=2,    {4 9 2 8 6}  2<8, index不变   
    • j=4  index=2,    {4 9 2 8 6}  2<6, index不变   

       第一趟中,一共比较了4次,找到了最小的数是 (r[index]=)2,位置下标是[index=]2 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 9 4 8 6}

  • 第二趟 i=1时     初始数组{2 9 4 8 6}
    • j=2  index=i=1, {2 9 4 8 6}  9>4, index->2
    • j=3  index=2,    {2 9 4 8 6}  4<8, index不变   
    • j=4  index=2,    {2 9 4 6}  4<6, index不变   

       第二趟中,一共比较了3次,找到了最小的数是 (r[index]=)4,位置下标是[index=]2 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 9 8 6}

  • 第三趟 i=2时     初始数组{2 4 9 8 6}
    • j=3  index=i=2, {2 4 9 8 6}  9>8, index->3 
    • j=4  index=3,    {2 4 9 8 6}  8>6, index-> 

       第三趟中,一共比较了2次,找到了最小的数是 (r[index]=)6,位置下标是[index=]4 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 6 8 9}

  • 第四趟 i=3时     初始数组{2 4 6 8 9}
    • j=4  index=i=3, {2 4 6 8 9}  8<9, index不变 

       第四趟中,一共比较了1次,找到了最小的数是 (r[index]=)8,位置下标是[index=]3 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 6 8 9}

4.完整代码(C++)

#include<iostream>
#include<cmath>
using namespace std;
#define N 500

void SelectSort(int r[],int n){
	//int temp=0;
	int i=0,j=0;
	int index=0;
	//排序n个数,子需要排序n-1趟就是有序数列了 
	for(i=0;i<n-1;i++){//每次循环后将第i小的元素放好 
		index=i;//记录从第i个到第n-1个元素中,最小的那个元素的下标 
		for(j=i+1;j<n;j++){
			if(r[index]>r[j]) index=j;
		}
	//将找到的第i个小元素放在第i个位置上 
	//temp=r[i];
	//r[i]=r[index];
	//r[index]=temp;
	swap(r[i],r[index]);//用于交换传入两个数值的函数
	}
}
int main(){
	cout<<"请输入数组中的元素个数n:"<<endl; 
	int n;
	cin>>n;	
	int r[N];
	cout<<"请输入需要选择排序的数组元素:"<<endl;
	for(int i=0;i<n;i++)
		cin>>r[i];
	
	SelectSort(r,n);
	for(int i=0;i<n;i++){
		cout<<r[i]<<"  ";
	}
	
	
	return 0;
}

 5.运行截图

6.参考文章

选择排序(超详细)_@烟雨倾城ゝ的博客-CSDN博客

选择排序C++实现(代码详解)_年少挽滑稽世无双的博客-CSDN博客

C++简单排序——选择排序_小天狼星_布莱克的博客-CSDN博客

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值