C++11写算法之选择排序
选择排序,顾名思义,指从数组后面将最小的值找出来,然后与最前面(指当前位置)值进行交换。
时间复杂度:O(n^2)
空间复杂度:O(1)
此处应用了C++11的auto , lambda , static_assert 。
show me the code !
// #if __cplusplus < 201103L
// #error "must be compiled under c++11 support platform!!!"
// #endif
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cassert>
using namespace std; void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void SelectSort(int varList[], const int size)
{
if (!varList || size <= )
{
return;
}
for (int i = ; i < size; i++)
{
int swapPos = i;
for (int j = i; j < size; j++)
{
if (varList[swapPos] > varList[j])
{
swapPos = j;
}
}
if (i != swapPos)
{
Swap(varList[i], varList[swapPos]);
}
}
} void test()
{
//case counter
int testCase = ;
//sort function object
auto sortFunc = SelectSort;
//show case result lambda function
auto showFunc = [&testCase](const char* caseDescription){cout << "case[" << testCase++ << "]\t(" << caseDescription << ") \t\tok " << endl; }; cout << "test begin : " << endl << endl; //case empty list
{
sortFunc(nullptr, );
showFunc("case empty list");
}
//case wrong size
{
int nTestList[] = { , , , , , , , , , };
sortFunc(nTestList, );
showFunc("case wrong size");
}
//case size == 1
{
int var = ;
int varList[] = { var };
sortFunc(varList, );
assert(var == varList[]);
showFunc("case size == 1");
}
//case normal sort
{
int varList[] = { , , , , , , , , , };
const int size = sizeof(varList) / sizeof(int);
const int resultList[] = { , , , , , , , , , };
static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!"); sortFunc(varList, size);
for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
showFunc("case normal sort");
}
//case sorted list
{
int varList[] = { , , , , , , , , , };
const int size = sizeof(varList) / sizeof(int);
const int resultList[] = { , , , , , , , , , };
static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!"); sortFunc(varList, size);
for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
showFunc("case sorted list");
}
cout << endl << "test done ! " << endl << endl;
}
int main(int argc, char* argv[])
{
test();
return ;
}
C++11写算法之选择排序的更多相关文章
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- java结构与算法之选择排序
一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...
- 【DS】排序算法之选择排序(Selection Sort)
一.算法思想 选择排序是一种简单直观的排序算法.它的工作原理如下: 1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列: 2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾 ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
- Java实现 蓝桥杯VIP 算法提高 选择排序
算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB 选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
- JavaScript ,Python,java,Go系列算法之选择排序
常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 用一张图概括: 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) ...
- 秒懂算法2——选择排序(C#实现)
算法思路: 每趟走访元素揪出一个最小(或最大)的元素,和相应位置的元素交换.(用数组{6,9,13,2,4,64} 举例) {},{6 9 13 [2] 4 64} //第一趟,揪出2 {2} ...
随机推荐
- nginx和selinux冲突
cat /var/log/audit/audit.log |grep nginx |grep denied| audit2allow -M mynginx 取出selinux中有关于nginx被拒绝的 ...
- Ubuntu16.04安装Pytorch
一.安装 1. 官方github:https://github.com/pytorch/pytorch Install optional dependencies //安装依赖项 On Linux e ...
- http://www.cnblogs.com/monian/p/3822980.html
http://www.cnblogs.com/monian/p/3822980.html
- Kinect 1.8 体感开发,手势,姿态(Pose) 捕捉判断方法以及一些辅方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- maven 打包不全(xml,properties文件没打进包)解决方案
在pom.xml的build标签中加入以下代码即可 <build> <resources> <resource> ...
- IntelliJ IDEA单元测试和代码覆盖率图解
转载:http://blog.csdn.net/u011872919/article/details/11566713 本文将展示如何使用IntelliJ IDEA开发单元测试和分析覆盖率. 1 创建 ...
- jQuery (样式篇)
1.$(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真正的的 ...
- python exec和eval
exec语句用来执行储存在字符串或文件中的Python语句.例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句.下面是一个简单的例子. >>> ...
- C语言-srand种子详解
rand() 函数取得随机数的时候是通过一个叫做"种子"的变量经过计算得出一个数值, 然后得出的数值再作为新的"种子"参与下一次的运算, 这样就得到了所谓的随机 ...
- WSDL接口数据传递以及外网发布需要注意的地方
A系统传递数据给B系统 1.A创建asmx推送接口如下 using System; using System.Collection.Generic; using System.Data; using ...