zoukankan      html  css  js  c++  java
  • 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

    作者:H·K
    出处:http://www.cnblogs.com/pythian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    linux网络编程之共享内存介绍
    linux网络编程之system v消息队列(二)
    一次性从git远程仓库中克隆到本地。
    返回随机数:整数、浮点数
    下载进度条
    os模块学习+open行数
    json数据处理:读取文件中的json字符串,转为python字典
    python执行命令行:python中执行shell命令行read结果
    format格式化输出
    python操作mongodb
  • 原文地址:https://www.cnblogs.com/pythian/p/4729138.html
Copyright © 2011-2022 走看看