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

  1. 选择排序算法实现思想个人理解

    一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...

  2. 算法与数据结构(冒泡排序,选择排序和插入排序的总结)

    冒泡排序,选择排序和插入排序的总结 在规模较小时,或者元素的有序性较高时,插入排序的时间复杂度可以接近 O(n) ,是上述三种排序里表现最好的 一.通过表格我们可以发现,冒泡排序的时间复杂度是要优于选 ...

  3. 算法与数据结构(选择排序)

    选择排序 Select Sort 从待排序序列中选出最小(或最大)元素,放入新建的有序序列中,并将其从原无序序列移除.不断重复直到无序序列最终没有元素剩余 选择排序规则: 总共要进行 n-1 次循环 ...

  4. c++Cocktail Selection Sort鸡尾酒选择排序的实现算法(附完整源码)

    C++Cocktail Selection Sort鸡尾酒选择排序的实现算法 C++Cocktail Selection Sort鸡尾酒选择排序的实现算法完整源码(定义,实现,main函数测试) C+ ...

  5. 归并排序,快速排序,冒泡排序,选择排序,基数排序,桶排序,堆排序(c++实现)

    一.归并排序 #include<iostream> using namespace std; void Merge(int arr[],int low,int mid,int high); ...

  6. SelectSort 选择排序

    SelectSort 选择排序算法: 总的时间复杂度为O(n^2) 思路是,外循环先遍历第一个数至倒数第二个,设置最小的那个数的索引,内循环为从i+1开始遍历到最后一个,找出有没有比当前最小数索引小的 ...

  7. 排序算法python实现_用Python,Java和C / C ++实现的选择排序算法

    排序算法python实现 The Selection Sort Algorithm sorts the elements of an array. In this article, we shall ...

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

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

  9. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

最新文章

  1. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
  2. python下载软件-python下载工具
  3. [css] word-wrap、word-break和white-space有什么区别?
  4. poj 3370 Halloween treats
  5. android 1141错误,Android Studio中报错的问题
  6. Error creating object Microsoft Data Access Components 2.1 (or later) have been properly installed
  7. 如何成为一名卓越的数据科学家——开篇七剑
  8. 二进制颜色查询对照表
  9. Centos7安装Rarlinux解压rar文件
  10. Go channel详解
  11. 关于LCR表和万用表测电容容值不一样的怪事
  12. Java年度考核表个人工作总结_个人年度工作总结java
  13. 硬核!深信服春招3面,终获20k入职offer!
  14. chrome必备插件
  15. 常用电子面单接口API demo下载(菜鸟快递鸟)
  16. c# 使用Microsoft.Office.Interop.Excel 对Excel操作
  17. 利用FFT 及 IFFT实现傅立叶正反变换
  18. ESP32 LVGL8.1 ——Style multiple styles 多种风格样式 (Style 12)
  19. Synchronized锁升级底层原理
  20. 离职那天,我们复员……

热门文章

  1. c++word书签_「职场必备」干货!WORD办公软件快捷键,小编整理拿走不谢
  2. java 取字符串中的数字_java截取字符串中的数字
  3. qq群 html,我的群组-普通群组.html
  4. java bitset_Java BitSet clone()方法及示例
  5. stl swap函数_vector :: swap()函数以及C ++ STL中的示例
  6. python 整数 1字节_Python程序打印代表整数的字节数组
  7. mysql怎么消除冗余,mysql剔除冗余数据
  8. HDU 5950——Recursive sequence
  9. C语言关键字 ISO/ANSI C90 C99 C11
  10. OC中的基本容器和基本数据类型