【发布时间】:2017-10-08 23:40:22
【问题描述】:
我一直在查看这里的所有线程,但似乎找不到有效的解决方案。排序有效,但与应有的速度相比,它的速度非常慢。这是代码(我正在处理头文件):
#pragma once
#ifndef DataGen_h
#define DataGen_h
#include "RandomSupport.h"
void merge(long list[], long start, long mid, long end) {
long i = start;
long j = mid + 1;
while (j <= end && i <= mid) {
if (list[i] < list[j]) {
i++;
}
else {
long temp = list[j];
for (long k = j; k > i; k--) {
list[k] = list[k - 1];
}
list[i] = temp;
mid++;
i++;
j++;
}
}
}
void merge_sort(long list[], long startIndex, long endIndex)
{
if (startIndex >= endIndex){
return;
}
long midIndex = (startIndex + endIndex) / 2;
merge_sort(list , startIndex, midIndex);
merge_sort(list, midIndex + 1, endIndex);
merge(list, startIndex, midIndex, endIndex);
}
void efficientRandomSortedList(long temp[], long s) {
// Get a new random device
randomizer device = new_randomizer();
// Get a uniform distribution from 1 to 1000
uniform_distribution range = new_distribution(1, 45000);
for (long i = 0; i < s; i++) {
// At every cell of the array, insert a randomly selected number
// from distribution defined above
temp[i] = sample(range, device);
}
// Now sort the array using insertion_sort
merge_sort(temp, 0, s - 1);
}
#endif /* DataGen_h */
这是针对班级的,所以很遗憾我无法更改正在使用的数据类型。对我的格式的任何帮助或一般批评都会有所帮助。
【问题讨论】:
-
您能提供一些性能数据吗?请记住,归并排序的平均性能为
O(N*lgN),因此如果您的代码扩展到此,那么就不会出错。 -
您的
merge是二次方的,因为您每次需要插入时都会移动O(n)元素。这有点破坏了整个观点。 -
我已经浏览了这里的所有主题,似乎找不到有效的解决方案。 -- 你搜索的不够仔细。你看到this thread了吗?
-
合并排序最适合链表,尝试pivot-sort,例如连续数据
-
@sp2danny 枢轴排序是否适用于较大的数据集?例如多达 1500 万个随机数字?