algorithm -- 选择排序

选择排序是《导论》第一章课后习题,仿照插入排序,再次运用循环不变式来证明下算法的正确性,C++ 源码:

// 交换函数 
void swap( int& a, int& b )
{a = a^b;b = a^b;a = a^b;
}
void selectSort( int *arr, int count )
{if( arr == nullptr || count == 0 ){return;}for( int i = 1; i < count; i++ ){int tem = arr[ i - 1 ];for( int j = i; j < count; j++ ){if( tem > arr[j] ){swap( tem, arr[ j ] );}}arr[ i - 1 ] = tem;}
}

传入待排序数组指针和数组大小,同样正在排序的元素前面的是已经排序好的部分,未排序的在后面。

  • 初始化: i = 1; tem = arr[ 0 ]; tem 等于第一个元素,依次和后面的元素比较,如果 tem 大则交换值,这样到和后面元素比较完后 tem 就是值最小的一个,赋值给 arr[ 0 ]arr[ 0 ] 的原值在比较过程中赋值给后面的第一个小于它的元素,数组本身数据没有增加或减少。

  • 保持:第 i 个元素排序时前面元素已经按从小到大的顺序排好了,依次各后面的元素比较,如果大于后面的元素则交换值,直到比较完全部剩余的元素,这时 tem 就是剩余元素中值最小的一个赋值给 arr[ i - 1 ],0~(i-1)的元素已经排好序了,后面的则是无序的

  • 终止: 当 i == count 时,循环条件不满足,跳出循环,此时 数组的前 i-1 个已排好顺序,而数组大小为 conut 个,数组最后一个元素的下标是 conut-1 等于此时的 i-1 ,所以此时数组已排好序了,算法正确。

循环不变式 的证明结束了,需要说明的一点是上面的交换函数:

// 交换函数 
void swap( int& a, int& b )
{a = a^b;b = a^b;a = a^b;
}

函数参数使用引用,可以修改参数原来的值,引用在 C++ 中是变量别名,即同一个变量可以有多个名字,区别定义是名字,其他的别名叫引用,引用可以像变量本身一样对数值操作,作为函数参数时,可以在函数内部修改变量;普通的函数参数,会将传递过来变量拷贝一份,在函数内部的修改不到影响外部变量的值。

函数内部使用 ^ 异或来交换值,异或是 运算符,位运算比一般的运算要快;异或有个特殊的性质,连续两次异或变量的值不会变,即第一次异或会变成奇怪的值,再次异或就会变成原值,这个交换函数就是利用这个性质,

  • a b 异或赋值 a, a是异或后的结果
  • a b 再次异或结果为原来的 a, 赋值 b,交换一个
  • a b(原a值)异或结果为原来的 b 赋值 a,交换完成

实践两次 循环不变式 下次尝试算法分析!

algorithm wiki GitHub

转载于:https://www.cnblogs.com/pythian/p/4729138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ueeditor无法上传图片_百度ue文本编辑器开发中无法上传图片

第一次发文&#xff0c;好紧张呀&#xff0c;不知道会不会没人看。之前用ue遇到了一些坑&#xff0c;没人看就当自己记录了笔记。第一次用&#xff0c;总是会遇到问题&#xff0c;可以先查看下百度ue的演示http://ueditor.baidu.com/website/onlinedemo.html和API http://fex.b…

SQL 语句优化--IN语句优化案例

为什么80%的码农都做不了架构师&#xff1f;>>> 今天客户系统升级&#xff0c;通过DMVs性能分析查了一下&#xff0c;升级后发现一个语句执行时间比较长&#xff0c;执行语句要好几秒钟&#xff0c;调出语句如下&#xff1a; select distinct field003 from ufi2j0…

Activity跳转

本例中MainActivity为&#xff1a;FirstActivity.java FirstActivity如下&#xff1a; package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java课程设计---项目数据库设计(含实体类)

1、数据库分析设计 将数据库命名为&#xff1a;db_student 分析系统中各角色之间的关系 2、表设计 &#xff08;1&#xff09;新建表tb_student&#xff08;学生表&#xff09; &#xff08;2&#xff09;新建表tb_admin&#xff08;管理员表&#xff09; &#xff08;3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;airu 校对&#xff1a;丁一Java NIO 由以下几个核心部分组成&#xff1a;ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件&#xff0c;但在我看来&#xff0c;Channel&#xff0c;Buffer…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019独角兽企业重金招聘Python工程师标准>>> Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录&#xff0c;一般存放临时缓存数据如果使用上面的方法&#xff0c;当你的应用在被用户卸载后&#xff0c;SDCard/Android/dat…

java 静态代码块_JAVA静态代码块

今天遇到下面的代码&#xff0c;感觉很奇怪&#xff0c;特意记录下&#xff1a;代码如下&#xff1a;public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context详解

1、Context概念&#xff1a; Context&#xff0c;相信不管是第一天开发Android&#xff0c;还是开发Android的各种老鸟&#xff0c;对于Context的使用一定不陌生~~你在加载资源、启动一个新的Activity、获取系统服务、获取内部文件&#xff08;夹&#xff09;路径、创建View操作…

WebApi路由

路由分为两种模式&#xff1a;模板路由和特性路由。 模板路由&#xff1a; 模板路由是ASP.NET Web API默认提供的路由。模板路由使用前需要定义路由模板。如下面默认的路由模板&#xff1a; 默认路由的URL格式是api/{controller}/{id}。api代表在资源前面要带上api目录&#xf…

java设计模式 组合_JAVA 设计模式 组合模式

用途组合模式 (Component)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有唯一性。组合模式是一种结构型模式。结构图-组合模式结构图Component: 组合中的对象声明接口&#xff0c;在适当的情况下&#xff0c;实现所有类共…

项目总结SpringMVC相关

流程文字概述1、用户发送请求至前端控制器DispatcherServlet2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、DispatcherServlet调用Ha…

SpringBoot登录登出切面开发

阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本。 对于系统而言&#xff08;这里多指管理系统或部分具备登录登出功能的系统&#xff09;&#xff0c;登录登出是一个类权限验证的过程&#xff0c;现在一般是以token进行校验&#xff0c;即用户输入登录信息&#xff0c…

spring --aop(日志记录)在工程中实际使用

2019独角兽企业重金招聘Python工程师标准>>> ###1.日志切面 package com.readygo.zbhealth.common;import java.util.Arrays; import java.util.List;import org.aspectj.lang.ProceedingJoinPoint;public class LoggingAspect {public Object Around(ProceedingJoi…

Neutorn LBaaS 原理

Load Balance as a Service&#xff08;LBaaS&#xff09;是 Neutron 提供的一项高级网络服务。LBaaS 允许租户在自己的网络中创建和管理 load balancer。 load balancer 可以说是分布式系统中比较基础的组件。 它接收前端发来的请求&#xff0c;然后将请求按照某种均衡策略转发…

java 内置函数_java8 四大内置核心函数式接口

其他补充接口&#xff1a;一、Consumer&#xff1a;消费型接口(void accept(T t))来看一个简单得例子&#xff1a;1 /**2 * 消费型接口Consumer3 */4 Test5 public void test1 () {6 consumo(500, (x) -> System.out.println(x));7 }89 public void consumo (double money, …

jQuery - (JQuery datatables api 使用解读)

学习可参考&#xff1a;http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/2006942 分别导入css和js文件 <link href"~/Content/bootstrap.css" rel"stylesheet" /> <link href"~/Content/datatab…

Tomcat配置JNDI数据源

经过3个多小时的努力&#xff0c;配置JNDI数据源(主要是通过DBCP连接池)终于搞定&#xff5e;还是Tomcat官方的说明好&#xff0c;不过全是英文的&#xff0c;大概还看得懂&#xff0e;百度上那么花花绿绿的太多了&#xff0c;一个也没成功&#xff01;&#xff0e;&#xff0e…

令牌验证 token

通过令牌验证在注册中心控制权限&#xff0c;以决定要不要下发令牌给消费者&#xff0c;可以防止消费者绕过注册中心访问提供者&#xff0c;另外通过注册中心可灵活改变授权方式&#xff0c;而不需修改或升级提供者。 可以全局设置开启令牌验证&#xff1a; <!--随机token令…

easybcd 支持 windows 10 和 ubuntu 14.04 双系统启动

家里计算机系统 windows 10 全新安装。 原本是双系统的&#xff0c;还有一个ubuntu。 windows 10 安装以后&#xff0c;恢复ubuntu就是问题了。 (事后经验&#xff1a;请不要立刻安装bcd修改工具) 最初的方法是利用easybcd修改bcd记录。操作是成功的&#xff0c;但系统重新启动…

需求分析与原型设计

结对者&#xff1a;031402140李严 0314026617林瑞斌 需求分析与原型设计 NABCD模型 N&#xff08;Need&#xff0c;需求&#xff09;: 收集信息的过程太过繁琐&#xff0c;有班级总负责人需汇总每一个同学的志愿并填入excel表中&#xff0c;上交年级负责人&#xff0c;年级负责…