关于对选择排序的一些理解

学过排序算法的应该知道选择排序是指从数组中找出最大的值放在相应的位置。一般需要两重循环来实现,外重循环确定待排序的序列,内重循环则找出待排序序列中的最大值,出循环时将该值与外重循环所指定的下表做一个交换(swap)。
不知道聪明的你有没有思考过,这个过程有一个递归的意思暗藏在里面。定义递归函数select,参数指定最大值待放入的位置start。

  1. 首先找出序列中的最大值,这里可由一个函数模块单独实现
  2. 将待放入的位置(由参数start指定)的值与最大值做一个交换
  3. 递归计算指定最大值为start+1的数组的select方法。
  4. 递归出口为start超出了数组长度(注意不是越界哈

相信读者您一定恍然大悟。不过,这个方式其实只是对选择排序的改写,而非改进,时间复杂度仍然是O(n^2)。证明如下:
由算法可知:
O(n)=n(找最大值所花的时间)+O(n-1)(剩下select的递归所花的时间);
.
.
O(2)=2+1;
O(1)=1;
所以数学归纳法证得时间复杂度为O(n^2)。
具体代码实现如下:

#include<iostream>
#include "func.h"
using namespace std;
int max(int a[],int start,int length)
{
	int locate=start;
	int finall=a[start];
	for(int i=start+1;i<length;i++)
	{
		if(finall<a[i])
		{
			finall=a[i];
			locate=i;
		}
	}
	return locate;
}
void swap(int &a, int &b)
{
	int temp=a;
	a=b;
	b=temp;
}
void selectsort(int a[],int start,int length)
{
	if(start<length)
	{
		int maxindex=max(a,start,length);
		swap(a[maxindex],a[start]);
		selectsort(a,start+1,length);
	}
}
void print(int a[],int length)
{
	for(int i=0;i<length;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
int main()
{
	int a[]={3,1,5,2,7,9,4,-1,12,10};
	selectsort(a,0,10);
	print(a,10);
	return 0;
}
void selectsort(int a[],int start,int length);
int max(int a[],int start,int length);
void print(int a[],int lengh);
void swap(int &a, int &b);

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值