选择排序是《导论》第一章课后习题,仿照插入排序,再次运用循环不变式来证明下算法的正确性,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 -- 选择排序的更多相关文章

  1. 选择排序java实现

    package text.algorithm; /** * 选择排序 * O(n^2);空间复杂度O(1); */public class SelectionSort { public static ...

  2. 【Algorithm】选择排序

    一. 算法描述 选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1 ...

  3. 【Algorithm】选择排序法

    简单的选择排序法思想: * 首先找到数组中最小的元素,将它和数组第一个元素互换位置(如果第一个元素就是最小那么它就和自己交换). * 其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素互换位置 ...

  4. CodeForces 489A SwapSort (选择排序法)

    SwapSort 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/A Description In this problem yo ...

  5. 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现

    随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...

  6. python算法之冒泡排序和选择排序

    一.冒泡排序(Bubble sort) Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorith ...

  7. 排序算法之选择排序的思想以及Java实现

    1 基本思想 选择排序的思想是,每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 2,算法的实现(Java) package Algorit ...

  8. java中级——二叉树比较冒泡和选择排序

    上次我们说到二叉树排序比较,给出如下的题目 题目:创建五万个随机数,然后用分别用冒泡法,选择法,二叉树3种排序算法进行排序,比较哪种更快 废话不说直接上源码,可以看控制台结果 注意的是 需要我们需要上 ...

  9. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. http websocket

    套接字 http 协议 tcp/ip协议 服务器端口 网络协议 http://wenku.it168.com/d_001406013.shtml 跨源 AJAX 事件驱动 http://www.lin ...

  2. Java轻量级业务层框架Spring两大核心IOC和AOP原理

    IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...

  3. nginx ssl 更换问题

    公司之前使用的是免费startssl证书,听说IOS 以后不信任这些免费的验证不严格的证书,公司果断购买了一个统配域名证书,其实不用貌似也没什么事,主要是提交app的时候得说明理由,被拒的可能性比较大 ...

  4. sublime text2 换主题

    网上看到一款喜欢的主题,换掉初始的主题,感觉颜色浅一点会比较好看,看中了下面这款. 后来看到有在 github 上的人做的 ,这是地址 ,上面也有详细的如何更改的步骤,下面是我自己这里做个备份. 1. ...

  5. Sublime Text3 快捷键

    选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数 ...

  6. linux下可执行程序的装载和启动

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.c文件的编译 图中显示了c ...

  7. react1

    1.方法用()  里面的每个参数之间用,分隔2.对象(函数.数组)用{} 3.{/*注释...*/} 4 组件的生命周期可分成三个状态:Mounting:已插入真实 DOMUpdating:正在被重新 ...

  8. [SQL] SQL 查出一张表中重复的所有记录

    在A表中存在一个字段“AccountId”,而且不同记录之间的“AccountId”值有可能会相同,现在就是需要查询出在该表中的各记录之间,“AccountId”值存在重复的项,这里count记录该字 ...

  9. 后缀数组(suffix array)

    参考: Suffix array - Wiki 后缀数组(suffix array)详解 6.3   Suffix Arrays - 算法红宝书 Suffix Array 后缀数组 基本概念 应用:字 ...

  10. table中的th td margin不生效

    margin-top,margin-left,margin-right,margin-bottom 是body中的属性th,td 是表格的元素与之对应的是padding-top,padding-lef ...