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
转载于:https://www.cnblogs.com/pythian/p/4729138.html
algorithm -- 选择排序相关推荐
- 选择排序算法实现思想个人理解
一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...
- 算法与数据结构(冒泡排序,选择排序和插入排序的总结)
冒泡排序,选择排序和插入排序的总结 在规模较小时,或者元素的有序性较高时,插入排序的时间复杂度可以接近 O(n) ,是上述三种排序里表现最好的 一.通过表格我们可以发现,冒泡排序的时间复杂度是要优于选 ...
- 算法与数据结构(选择排序)
选择排序 Select Sort 从待排序序列中选出最小(或最大)元素,放入新建的有序序列中,并将其从原无序序列移除.不断重复直到无序序列最终没有元素剩余 选择排序规则: 总共要进行 n-1 次循环 ...
- c++Cocktail Selection Sort鸡尾酒选择排序的实现算法(附完整源码)
C++Cocktail Selection Sort鸡尾酒选择排序的实现算法 C++Cocktail Selection Sort鸡尾酒选择排序的实现算法完整源码(定义,实现,main函数测试) C+ ...
- 归并排序,快速排序,冒泡排序,选择排序,基数排序,桶排序,堆排序(c++实现)
一.归并排序 #include<iostream> using namespace std; void Merge(int arr[],int low,int mid,int high); ...
- SelectSort 选择排序
SelectSort 选择排序算法: 总的时间复杂度为O(n^2) 思路是,外循环先遍历第一个数至倒数第二个,设置最小的那个数的索引,内循环为从i+1开始遍历到最后一个,找出有没有比当前最小数索引小的 ...
- 排序算法python实现_用Python,Java和C / C ++实现的选择排序算法
排序算法python实现 The Selection Sort Algorithm sorts the elements of an array. In this article, we shall ...
- CodeForces 489A SwapSort (选择排序法)
SwapSort 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/A Description In this problem yo ...
- 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序
[简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...
最新文章
- 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
- python下载软件-python下载工具
- [css] word-wrap、word-break和white-space有什么区别?
- poj 3370 Halloween treats
- android 1141错误,Android Studio中报错的问题
- Error creating object Microsoft Data Access Components 2.1 (or later) have been properly installed
- 如何成为一名卓越的数据科学家——开篇七剑
- 二进制颜色查询对照表
- Centos7安装Rarlinux解压rar文件
- Go channel详解
- 关于LCR表和万用表测电容容值不一样的怪事
- Java年度考核表个人工作总结_个人年度工作总结java
- 硬核!深信服春招3面,终获20k入职offer!
- chrome必备插件
- 常用电子面单接口API demo下载(菜鸟快递鸟)
- c# 使用Microsoft.Office.Interop.Excel 对Excel操作
- 利用FFT 及 IFFT实现傅立叶正反变换
- ESP32 LVGL8.1 ——Style multiple styles 多种风格样式 (Style 12)
- Synchronized锁升级底层原理
- 离职那天,我们复员……
热门文章
- c++word书签_「职场必备」干货!WORD办公软件快捷键,小编整理拿走不谢
- java 取字符串中的数字_java截取字符串中的数字
- qq群 html,我的群组-普通群组.html
- java bitset_Java BitSet clone()方法及示例
- stl swap函数_vector :: swap()函数以及C ++ STL中的示例
- python 整数 1字节_Python程序打印代表整数的字节数组
- mysql怎么消除冗余,mysql剔除冗余数据
- HDU 5950——Recursive sequence
- C语言关键字 ISO/ANSI C90 C99 C11
- OC中的基本容器和基本数据类型