nth_element 测试程序


  1 /********************************************************************
2 created: 2014/04/29 11:35
3 filename: nth_element.cpp
4 author: Justme0 (http://blog.csdn.net/justme0)
5
6 purpose: nth_element
7 *********************************************************************/
8
9 #include <cstdio>
10 #include <cstdlib>
11 #include <cstring>
12
13 typedef int Type;
14
15 template <class T>
16 inline T * copy_backward(const T *first, const T *last, T *result) {
17 const ptrdiff_t num = last - first;
18 memmove(result - num, first, sizeof(T) * num);
19 return result - num;
20 }
21
22 /*
23 ** 将 value 插到 last 前面(不包括 last)的区间
24 ** 此函数保证不会越界(主调函数已判断),因此以 unguarded_ 开头
25 */
26 template <class RandomAccessIterator, class T>
27 void unguarded_linear_insert(RandomAccessIterator last, T value) {
28 RandomAccessIterator next = last;
29 --next;
30 while(value < *next) {
31 *last = *next;
32 last = next;
33 --next;
34 }
35 *last = value;
36 }
37
38 /*
39 ** 将 last 处的元素插到[first, last)的有序区间
40 */
41 template <class RandomAccessIterator>
42 void linear_insert(RandomAccessIterator first, RandomAccessIterator last) {
43 Type value = *last;
44 if (value < *first) { // 若尾比头小,就将整个区间一次性向后移动一个位置
45 copy_backward(first, last, last + 1);
46 *first = value;
47 } else {
48 unguarded_linear_insert(last, value);
49 }
50 }
51
52 template <class RandomAccessIterator>
53 void insertion_sort(RandomAccessIterator first, RandomAccessIterator last) {
54 if (first == last) {
55 return ;
56 }
57
58 for (RandomAccessIterator ite = first + 1; ite != last; ++ite) {
59 linear_insert(first, ite);
60 }
61 }
62
63 template <class T>
64 inline const T & median(const T &a, const T &b, const T&c) {
65 if (a < b) {
66 if (b < c) {
67 return b;
68 } else if (a < c) {
69 return c;
70 } else {
71 return a;
72 }
73 } else if (a < c) {
74 return a;
75 } else if (b < c) {
76 return c;
77 } else {
78 return b;
79 }
80 }
81
82 template <class ForwardIterator1, class ForwardIterator2>
83 inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
84 Type tmp = *a; // 源码中的 T 由迭代器的 traits 得来,这里简化了
85 *a = *b;
86 *b = tmp;
87 }
88
89 /*
90 ** 设返回值为 mid,则[first, mid)中迭代器指向的值小于等于 pivot;
91 ** [mid, last)中迭代器指向的值大于等于 pivot
92 ** 这是 STL 内置的算法,会用于 nth_element, sort 中
93 ** 笔者很困惑为什么不用 partition
94 */
95 template <class RandomAccessIterator, class T>
96 RandomAccessIterator unguarded_partition(RandomAccessIterator first, RandomAccessIterator last, T pivot) {
97 while(true) {
98 while (*first < pivot) {
99 ++first;
100 }
101 --last;
102 while (pivot < *last) { // 若 std::partition 的 pred 是 IsLess(pivot),这里将是小于等于
103 --last;
104 }
105 if (!(first < last)) { // 小于操作只适用于 random access iterator
106 return first;
107 }
108 iter_swap(first, last);
109 ++first;
110 }
111 }
112
113 template <class RandomAccessIterator>
114 void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last) {
115 while (last - first > 3) {
116 RandomAccessIterator cut = unguarded_partition(first, last, Type(median(
117 *first,
118 *(first + (last - first) / 2),
119 *(last - 1))));
120 if (cut <= nth) {
121 first = cut;
122 } else {
123 last = cut;
124 }
125 }
126 insertion_sort(first, last);
127 }
128
129
130 int main(int argc, char **argv) {
131 int arr[] = {22, 30, 30, 17, 33, 40, 17, 23, 22, 12, 20};
132 int size = sizeof arr / sizeof *arr;
133
134 nth_element(arr, arr + 5, arr + size);
135
136 for (int i = 0; i < size; ++i) {
137 printf("%d ", arr[i]); // 20 12 22 17 17 22 23 30 30 33 40
138 }
139 printf("\n");
140
141 system("PAUSE");
142 return 0;
143 }

nth_element 测试程序,码迷,mamicode.com

时间: 2024-11-07 23:50:24

nth_element 测试程序的相关文章

#这个测试程序有助于我们理解wxPython的界面设计,基本的控件和事件调用都有

#!/bin/env python # -*- coding: utf-8 -*- ################################################################################# #这个测试程序有助于我们理解wxPython的界面设计,基本的控件和事件调用都有 ################################################################################# imp

PHP中测试程序执行时间

通常为了估测某段较复杂的程序的执行时间或比较多种方案中个方案的执行效率,我们需要计算程序执行所耗费的时间,代码如下: $start_time = microtime(true);          //获取程序开始执行的时间 $end_time = microtime(true);            //获取程序执行结束的时间 $exec_time = $end_time - $start_time;   //计算差值 echo $exec_time; PHP中测试程序执行时间,布布扣,bu

OpenCV 1.0在VC6下安装与配置(附测试程序)

步骤: 1 安装Visual C++ 6.0         2 安装OpenCV 1.0        3 配置Windows环境变量         4 配置Visual C++ 6.0             4.1 全局设置             4.2 项目设置 5 测试程序 1.安装Visual C++ 6.0          链接就不放了,网上下载安装即可. 2.安装OpenCV 1.0 下载OpenCV1.0安装程序.本人将OpenCV安装到D:\Program Files\

STL中的nth_element()方法的使用

STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的,下面是这个方法的具体使用方法. 1 #include <iostream> 2 3 #include <algorithm> 4 5 #include <functional>

记录-Kaa测试程序

有感于一天的折腾,总的留个纪念. 以下的内容不是我的原创,只是自己的一个记录. Kaa是什么?去官网看看就知道了 ,我也没咋细看,哈哈. 一.测试环境准备 Host OS:WIN7 Vbox:版本 5.1.14 r112924 (Qt5.6.2) Sandbox:一个Kaa配置好的测试用虚拟机镜像.这个只是用来测试或者小范围应用的,官方也提供在AWS上直接部署,方便测试.如果是要配置集群,you can download ready-to-use Debian or RPM packages f

Linux Boost 安装, 测试程序

下载: wget http://101.96.10.75/ncu.dl.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.bz2 tar xf boost_1_62_0.tar.bz2  cd boost_1_62_0/ 编译安装 bash bootstrap.sh  echo $? ./b2 echo $? sudo ./b2 install --prefix=/tmp/haha  #/tmp/haha是我建立的目录 ech

Ubuntu 16.04上编译SkyEye的测试程序

一.首先确保Ubuntu系统上已经安装了Skyeye.skyeye-testsuite和arm-linux-gcc交叉编译工具链,如果没有安装请参考: 1.Skyeye的安装:http://www.cnblogs.com/softhal/p/5697500.html 2.arm-linux-gcc的安装:http://www.cnblogs.com/softhal/p/5699381.html 二.编译skyeye-testsuite中的例子: 1.进入skyeye-testsuite的安装目录

JUnit 3.8 让所有测试程序 实现 复合的测试(TestSuite)

之前是单个单个程序测试,这种方式在测试类比较少的时候可行, 但测试类多了,单个单个的这个测试方式就不推荐了,那得使用 复合的测试了 一个TestSuite是一个复合的测试.它运行测试用例集.   这个测试程序就是把一个包的全部 测试程序一起测试,而不用单个单个测试 具体代码: [java] view plain copy package com.junit3_8; import junit.framework.Test; import junit.framework.TestCase; impo

STL之nth_element()(取容器中的第n大值)

nth_element()函数 头文件:#include<algorithm> 作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0开始计数的,也就是说求第0小的元素就是最小的数. 如:a[start,end]元素区间.排序后a[n]就是数列中第n+1大的数(下标从0开始计数).要注意的是a[start,n),     a[n,end]内的大小顺序还不一定.只能确定a[n]是数列中第n+1大的数.当然a[start,n)中的数肯定不大于     a[n,end]中