- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用不同的算法对数组进行排序。我使用的每个算法似乎都可以正常工作,但是我的 IntroSort 的行为很奇怪。它总是比 QuickSort 慢,对于大量元素,例如百万,它需要几分钟,而 QuickSort 大约需要。 1.2 秒。
我尝试为内省(introspection)、堆和插入排序重写代码几次,结果相同。这种行为的原因是什么?我的代码有问题吗?
我正在使用的函数(来自文件算法.h)
#pragma once
template <typename T>
void display_array(T* arr, int n) { // displays full array in one line
for (int i = 0; i < n; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
}
template <typename T>
void swap_values(T* x, T* y) { // swaps two values
T tmp = *x;
*x = *y;
*y = tmp;
}
/* * * * Quick Sort * * * */
template <typename T>
int quickS_part(T* arr, int left, int right) {
int position = left;
T pivot = arr[right];
for (int i = left; i < right; i++) {
if (arr[i] <= pivot) {
swap_values(&arr[i], &arr[position]);
position++;
}
}
swap_values(&arr[position], &arr[right]);
return position;
}
template <typename T>
void quick_sort(T* arr, int left, int right) {
if (left < right) {
int pivot = quickS_part(arr, left, right);
quick_sort(arr, left, pivot - 1);
quick_sort(arr, pivot + 1, right);
}
}
/* * * * Heap Sort * * * */
template <typename T>
void heapify(T* arr, int size, int root) {
int largest = root;
int left = 2 * root + 1;
int right = 2 * root + 2;
if (left < size && arr[left] > arr[largest])
largest = left;
if (right < size && arr[right] > arr[largest])
largest = right;
if (largest != root) {
swap_values(&arr[root], &arr[largest]);
heapify(arr, size, largest);
}
}
template <typename T>
void heap_sort(T* arr, int size) {
for (int i = size / 2 - 1; i >= 0; i--)
heapify(arr, size, i);
for (int i = size - 1; i >= 0; i--) {
swap_values(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}
/* * * * Insertion Sort * * * */
template <typename T>
void insertion_sort(T* arr, int left, int size) {
for (int i = 1; i < size; i++) {
T k = arr[i];
int j = i - 1;
while (k < arr[j] && j >= 0) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = k;
}
}
/* * * * Introspective Sort * * * */
template <typename T>
void introS(T* arr, int left, int right, int maxdepth) {
if ((right - left) < 16)
insertion_sort(arr, left, right + 1);
else if (maxdepth == 0)
heap_sort(arr, right + 1);
else {
int pivot = quickS_part(arr, left, right);
introS(arr, left, pivot - 1, maxdepth - 1);
introS(arr, pivot + 1, right, maxdepth - 1);
}
}
template <typename T>
void intro_sort(T* arr, int left, int right) {
int md = 2 * floor(log(right + 1));
introS(arr, left, right, md);
}
#include <iostream>
#include <ctime>
#include <chrono>
#include <cmath>
#include "algorithms.h"
int main()
{
//srand(time(NULL));
const int size = 1000000;
int *test1;
test1 = new int[size];
for (int i = 0; i < size; i++)
test1[i] = rand() % 1000000;
auto start = std::chrono::high_resolution_clock::now();
intro_sort(test1, 0, size - 1);
auto end = std::chrono::high_resolution_clock::now();
double time = std::chrono::duration<double, std::milli>(end - start).count();
std::cout << "Sorting took " << time << " milliseconds." << std::endl;
delete[] test1;
return 0;
}
最佳答案
事实证明,堆排序和插入排序没有正确实现。我认为发生的情况是,当它们被调用时,它们会尝试对整个数组而不是其中的一部分进行排序。
这是对我有用的正确版本:
插入排序:
template <typename T>
void insertion_sort(T* arr, int left, int size) {
for (int i = left; i < size; i++) {
T k = arr[i];
int j = i - 1;
while (k < arr[j] && j >= left) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = k;
}
}
template <typename T>
void heap_sort(T* arr, int start, int size) {
for (int i = size / 2 - 1; i >= start; i--)
heapify(arr, size, i); // there are no changes in "heapify" function
for (int i = size - 1; i >= start; i--) {
swap_values(&arr[start], &arr[i]);
heapify(arr, i, start);
}
}
template <typename T>
void introS(T* arr, int left, int right, int maxdepth) {
if ((right - left) < 16)
insertion_sort(arr, left, right + 1);
else if (maxdepth == 0)
heap_sort(arr, left, right + 1);
else {
int pivot = quickS_part(arr, left, right);
introS(arr, left, pivot - 1, maxdepth - 1);
introS(arr, pivot + 1, right, maxdepth - 1);
}
}
关于c++ - 内省(introspection)排序有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60782948/
我想测试签名中第一个对象的类型。以下显示了我发现的一些方法。但是为什么对类型(以下 3 个测试中的第 2 个)的智能匹配不起作用? 有没有比对 Type 等效的字符串进行字符串化和测试更好的方法? (
基于 recent exchange ,我已经确信使用 Template Haskell 生成一些代码以确保编译时类型安全。 我需要内省(introspection)记录字段名称和类型。我明白我可以
我正在尝试使用不同的算法对数组进行排序。我使用的每个算法似乎都可以正常工作,但是我的 IntroSort 的行为很奇怪。它总是比 QuickSort 慢,对于大量元素,例如百万,它需要几分钟,而 Qu
我在一个我已经工作了一段时间的 Java EE 6 应用程序中依靠内省(introspection)进行 XML 处理。到目前为止,效果很好。但是,我必须重命名属性 setter 名称。问题是,Int
我正在使用旧版本的 python,2.6.5。我可以使用 dir 来查看对象具有哪些成员,但我想区分对象中的成员与从父类继承的成员。 class Parent(object): def par
使用普通的 lisp,我假设内省(introspection)属性。我如何将代码添加到常见的 lisp 代码中,这些代码将告诉我何时调用函数以及何时完成执行。我想采用任何 lisp 代码和对代码的这种
我一直主要使用 PHP 进行编程,我正在尝试切换到 Python。我精通 PHP,而且我从来不需要使用内省(introspection)/内省(introspection)之类的功能。代码自省(int
我如何从 b.func() 内省(introspection) A 的实例(即 A 的实例的 self ): class A(): def go(self): b=B()
我试图弄清楚如何获取方法上所有装饰器的名称。我已经可以获取方法名称和文档字符串,但不知道如何获取装饰器列表。 最佳答案 我很惊讶这个问题太老了,没有人花时间添加实际的内省(introspection)
Java 内省(Introspector)深入理解 一些概念: 内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。 JavaBea
对于为 DBIx::Class (::Schema::Loader) 转储 Sybase 模式的 Perl 库,我需要能够自省(introspection) DEFAULT 和计算列。 假设我们有:
.NET 中的自省(introspection)和反射有什么区别 最佳答案 它们是同一个整体的两个部分。 内省(introspection)是指一个类查看“内部”自身并查看例如方法采用哪些参数、其成员
假设我有: // test.js function myFunc(a,b,c) { return "Test"; } module.exports.myFunc = myFunc; 我怎样才能
假设我有一个 D 模板结构: struct Foo(alias pred) {} 我想写一个模板来反省 pred 是什么: alias Foo!"a < b" FooLess; static asse
我想列出 qooxdoo 对象的所有成员。我找到了一种方法来做到这一点,但我认为一定有更清洁的方法吗? for (var key in obj) { if (key.startsWith('$$u
这个问题在这里已经有了答案: Does Swift support reflection? (6 个答案) 关闭 8 年前。 是否可以在运行时确定Any对象的类?并将类转换为人类可读的字符串? 是否
这是我正在处理的简化版本: def mydecorator(prop): def wrapper(self_arg): return prop(self_arg) + 'bar
我有一个测试类和一个如下所示的设置函数: @pytest.fixture(autouse=True, scope='function') def setup(self, request): s
所以我正在研究一种文件格式,用于存储在某种范围内定义的结构化数据。最简单的例子是随时间变化的浮点值,但我将其设计为在每个点都允许多个维度和任意数据。我也想将数据结构存储在文件头中,因为它可以提供一些简
我正在玩弄 html 客户端存储,想知道是否有任何用于自省(introspection)数据库的工具 - 是否有等效的 sqlite“.tables”或“.schema”? 此外,我没有在 AppDa
我是一名优秀的程序员,十分优秀!