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 
algorithm -- 选择排序的更多相关文章
- 选择排序java实现
package text.algorithm; /** * 选择排序 * O(n^2);空间复杂度O(1); */public class SelectionSort { public static ...
- 【Algorithm】选择排序
一. 算法描述 选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1 ...
- 【Algorithm】选择排序法
简单的选择排序法思想: * 首先找到数组中最小的元素,将它和数组第一个元素互换位置(如果第一个元素就是最小那么它就和自己交换). * 其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素互换位置 ...
- CodeForces 489A SwapSort (选择排序法)
SwapSort 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/A Description In this problem yo ...
- 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现
随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...
- python算法之冒泡排序和选择排序
一.冒泡排序(Bubble sort) Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorith ...
- 排序算法之选择排序的思想以及Java实现
1 基本思想 选择排序的思想是,每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 2,算法的实现(Java) package Algorit ...
- java中级——二叉树比较冒泡和选择排序
上次我们说到二叉树排序比较,给出如下的题目 题目:创建五万个随机数,然后用分别用冒泡法,选择法,二叉树3种排序算法进行排序,比较哪种更快 废话不说直接上源码,可以看控制台结果 注意的是 需要我们需要上 ...
- 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 关于Markdown
之前有接触过一点markdown,知道能生成好看的排版,只是太懒都不去看不去记那些标签 现在才发现它简单好用得有点伟大 一个在线的Markdown编辑器:https://stackedit.io/ed ...
- 22-React JSX语法
React JSX语法 JSX只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,当然你想直接使用纯Javascript代码写也是可以的,只是利用JSX,组件的结构和 ...
- xml 方式更新和获取 配置文件 appSettings 节点 解决办法
最近在搞一个小程序,会用到动态修改配置文件来进行处理,在百度上找了很多办法,但是始终达不到我预想的效果,先列出程序运行环境和开发工具版本: 开发工具:VS2010 .Net 运行环境:4.0 有两种方 ...
- Ext5实现树形下拉框ComboBoxTree
最近为了实现一个属性下拉框被Ext框架折腾了好几天.. 所以,首先要说的是,不管你要做什么系统.强烈建议你不要选择Ext.据我这几天的搜索,应该这个框架现在用的人也很少了. Ext框架的缺陷:框架沉重 ...
- SLAM前端技术选择思考
以前是专门做室内定位技术研究的,先后学习和分析了多种基于电磁的室内定位技术,如WiFi指纹定位(先后出现过RSSI.CTF.CIR多种指纹特征).WiFi ToF定位.低功耗蓝牙BLE以及iBeaco ...
- provider 设计模式
相关介绍文章: Provider Model Design Pattern and Specification, Part 1 (old but detailed). The ASP.NET 2.0 ...
- ichart.js绘制虚线 ,平均分虚线
var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元"," ...
- Mysql notes
1. 数据库操作 database management create database sampleDatabase; --创建数据库sampleDatabase show databases; - ...
- 一些JavaScript中的DOM的优化小技巧
在进行DOM优化时需要关注的问题有:修改DOM的时候,会引起页面的重排,重绘.因为JS是单线程执行的,那么在重排重绘的过程中可能会阻塞用户的操作.为了更好的用户体验,必须要严格控制这些操作. 一.对象 ...
- Asp.Net_Mvc_获取当前Url、Controller、Action
一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...