选择排序,顾名思义,指从数组后面将最小的值找出来,然后与最前面(指当前位置)值进行交换。

时间复杂度:O(n^2)

空间复杂度:O(1)

此处应用了C++11的auto , lambda , static_assert 。

show me the code !

  1. // #if __cplusplus < 201103L
  2. // #error "must be compiled under c++11 support platform!!!"
  3. // #endif
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <iterator>
  7. #include <cassert>
  8. using namespace std;
  9.  
  10. void Swap(int& a, int& b)
  11. {
  12. int tmp = a;
  13. a = b;
  14. b = tmp;
  15. }
  16. void SelectSort(int varList[], const int size)
  17. {
  18. if (!varList || size <= )
  19. {
  20. return;
  21. }
  22. for (int i = ; i < size; i++)
  23. {
  24. int swapPos = i;
  25. for (int j = i; j < size; j++)
  26. {
  27. if (varList[swapPos] > varList[j])
  28. {
  29. swapPos = j;
  30. }
  31. }
  32. if (i != swapPos)
  33. {
  34. Swap(varList[i], varList[swapPos]);
  35. }
  36. }
  37. }
  38.  
  39. void test()
  40. {
  41. //case counter
  42. int testCase = ;
  43. //sort function object
  44. auto sortFunc = SelectSort;
  45. //show case result lambda function
  46. auto showFunc = [&testCase](const char* caseDescription){cout << "case[" << testCase++ << "]\t(" << caseDescription << ") \t\tok " << endl; };
  47.  
  48. cout << "test begin : " << endl << endl;
  49.  
  50. //case empty list
  51. {
  52. sortFunc(nullptr, );
  53. showFunc("case empty list");
  54. }
  55. //case wrong size
  56. {
  57. int nTestList[] = { , , , , , , , , , };
  58. sortFunc(nTestList, );
  59. showFunc("case wrong size");
  60. }
  61. //case size == 1
  62. {
  63. int var = ;
  64. int varList[] = { var };
  65. sortFunc(varList, );
  66. assert(var == varList[]);
  67. showFunc("case size == 1");
  68. }
  69. //case normal sort
  70. {
  71. int varList[] = { , , , , , , , , , };
  72. const int size = sizeof(varList) / sizeof(int);
  73. const int resultList[] = { , , , , , , , , , };
  74. static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!");
  75.  
  76. sortFunc(varList, size);
  77. for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
  78. showFunc("case normal sort");
  79. }
  80. //case sorted list
  81. {
  82. int varList[] = { , , , , , , , , , };
  83. const int size = sizeof(varList) / sizeof(int);
  84. const int resultList[] = { , , , , , , , , , };
  85. static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!");
  86.  
  87. sortFunc(varList, size);
  88. for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
  89. showFunc("case sorted list");
  90. }
  91. cout << endl << "test done ! " << endl << endl;
  92. }
  93. int main(int argc, char* argv[])
  94. {
  95. test();
  96. return ;
  97. }

C++11写算法之选择排序的更多相关文章

  1. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  2. java结构与算法之选择排序

    一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...

  3. 【DS】排序算法之选择排序(Selection Sort)

    一.算法思想 选择排序是一种简单直观的排序算法.它的工作原理如下: 1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列: 2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾 ...

  4. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  5. Java实现 蓝桥杯VIP 算法提高 选择排序

    算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB  选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...

  6. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  7. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

  8. JavaScript ,Python,java,Go系列算法之选择排序

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 用一张图概括:   选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) ...

  9. 秒懂算法2——选择排序(C#实现)

    算法思路: 每趟走访元素揪出一个最小(或最大)的元素,和相应位置的元素交换.(用数组{6,9,13,2,4,64} 举例) {},{6 9 13 [2] 4 64}     //第一趟,揪出2 {2} ...

随机推荐

  1. Heartbleed漏洞利用程序

    #!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspe ...

  2. openstack学习笔记(一)-openstack的基础知识

    一.OpenStack的基础知识 openstack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache2.0许可证(兼容GPLv3以及DFSG)授权的自由软件和 ...

  3. mybatis 一对多

    person package com.kerwin.mybatis.pojo; import java.util.List; public class Person { private int id; ...

  4. UNIX管道符

    在Unxi操作系统中,标准输入和标准输出是外壳程序中可以单独使用的两个独立流.但是有时候系统工程师需要让某些特定的输入源不起作用.当系统工程师在开发一些实用的脚本程序的过程中,经常需要用到.   一. ...

  5. LoadRunner测试AJAX

    什么是AJAX? Ajax, shorthand for Asynchronous JavaScript and XML, is a web development technique for cre ...

  6. C++第4次实验(基础班)—循环结构程序设计

    此次上机中的4个题目项目6.项目7(选1)必做.其他2两题可从剩下的项目中选,也可从项目7中选. [项目1:利用循环求和]求1000以内全部偶数的和(答案:250500) 要求:请编出3个程序来,分别 ...

  7. varchar2 和varchar区别

    1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节:2.VARCHAR2把空串等同于null处理,而varchar仍按 ...

  8. 一站式学习Wireshark(转载)

    一站式学习Wireshark(一):Wireshark基本用法 2014/06/10 · IT技术 · 4 评论 · WireShark 分享到: 115 与<YII框架>不得不说的故事— ...

  9. SSH——增删改的实现二

    二.批量删除 逻辑删除取派员,将取派员的deltag改为“1” 1. 为“作废”按钮绑定事件 //批量删除取派员 function doDelete(){ //获得选中的行 var rows = $( ...

  10. AspectJ 是什么

    http://www.blogjava.net/hwpok/archive/2008/06/28/211312.html 1. 序 Aspect Oriented Programming (AOP)是 ...