Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 排序方法的奇怪运行时结果_C++_Sorting_Merge_Runtime - Fatal编程技术网

C++ 排序方法的奇怪运行时结果

C++ 排序方法的奇怪运行时结果,c++,sorting,merge,runtime,C++,Sorting,Merge,Runtime,我有迭代合并排序、合并排序、快速排序、插入排序和冒泡排序 理想情况下,我认为运行时应该是: 迭代合并排序>快速排序>合并排序>插入排序~气泡排序 void BubbleSort(vector<int> &items, int beginIndex, int endIndex) { bool Swapped = true; int n = (int)items.size(); while(Swapped) { Swapped = false; for(int i

我有迭代合并排序、合并排序、快速排序、插入排序和冒泡排序

理想情况下,我认为运行时应该是:

迭代合并排序>快速排序>合并排序>插入排序~气泡排序

void BubbleSort(vector<int> &items, int beginIndex, int endIndex)
{
bool Swapped = true;
int n = (int)items.size();
while(Swapped)
{
    Swapped = false;
    for(int index = 1; index < n; index++)
    {
        if(items[index - 1] > items[index])
        {
            Swap(items, index - 1, index);
            Swapped = true;
        }
    }
    n = n - 1;
    }
}

void Swap(vector<int> &items, int a, int b)
{
int temp = items[a];
items[a] = items[b];
items[b] = temp;
}
然而,在插入排序和冒泡排序方面,我始终获得最快的运行时间。 你能帮我找出为什么我会得到这样的结果吗

我的测试按以下顺序运行:

迭代合并排序->合并排序->快速排序->插入排序->冒泡排序

void BubbleSort(vector<int> &items, int beginIndex, int endIndex)
{
bool Swapped = true;
int n = (int)items.size();
while(Swapped)
{
    Swapped = false;
    for(int index = 1; index < n; index++)
    {
        if(items[index - 1] > items[index])
        {
            Swap(items, index - 1, index);
            Swapped = true;
        }
    }
    n = n - 1;
    }
}

void Swap(vector<int> &items, int a, int b)
{
int temp = items[a];
items[a] = items[b];
items[b] = temp;
}
完成每次排序(10次)后,我计算平均运行时间

结果如下:

Sort employed: IterativeMergeSort
Average: 1574446
Sort employed: MergeSort
Average: 1728212
Sort employed: QuickSort
Average: 1002544
Sort employed: InsertSort
Average: 681322
Sort employed: BubbleSort
Average: 966246
这是我的分类代码: 迭代合并排序

void IterativeMergeSort(vector<int> &items, int beginIndex, int endIndex)
{
    if(items.size() < 2)
    {
        return;
    }
    else
    {
        int num = endIndex + 1;
        int mid, right;
        for(int size = 1; size < num; size *= 2)
    {
        for(int left = 0; left < num - size; left += (size*2))
        {
            mid = left + (size - 1);
            if( mid >= num)
            {
                mid = num - 1;
            }
            right = left + ((2 * size) - 1);

            if( right >= num)
            {
                right = num - 1;
            }

            IterativeMerge(items, left, mid, right);
            }
        }
    }
}

void IterativeMerge(vector<int> &items, int start, int mid, int end)
{
vector<int> temp(items.size());
int tempIndex = start;
int leftIndex = start;
int rightIndex = mid+1;
while (leftIndex <= mid && rightIndex <= end)
{
    if(items[leftIndex] <= items[rightIndex])
    {
        temp[tempIndex] = items[leftIndex];
        leftIndex++;
    }
    else
    {
        temp[tempIndex] = items[rightIndex];
        rightIndex++;
    }
    tempIndex++;
}
while (leftIndex <= mid)
{
    temp[tempIndex] = items[leftIndex];
    leftIndex++;
    tempIndex++;
}
while(rightIndex <= end)
{
    temp[tempIndex] = items[rightIndex];
    rightIndex++;
    tempIndex++;
}
for(tempIndex = start; tempIndex <= end; tempIndex++)
{
    items[tempIndex] = temp[tempIndex];
    }
}
void MergeSort(vector<int> &items, int beginIndex, int endIndex)
{
if(beginIndex < endIndex)
{
    int mid = beginIndex + (endIndex - beginIndex) / 2;
    MergeSort(items, beginIndex, mid);
    MergeSort(items, mid + 1, endIndex);
    Merge(items, beginIndex, mid, endIndex);
    }
}

void Merge(vector<int> &items, int first, int mid, int last)
{
vector<int> temp(items.size(), 0);

int first1 = first;
int last1 = mid;
int first2 = mid + 1;
int last2= last;

int index = first1;

while ((first1 <= last1) && (first2 <= last2))
{
    if(items[first1] <= items[first2])
    {
        temp[index] = items[first1];
        first1++;
    }
    else
    {
        temp[index] = items[first2];
        first2++;
    }
    index++;
}

while(first1 <= last1)
{
    temp[index] = items[first1];
    first1++;
    index++;
}

while(first2 <= last2)
{
    temp[index] = items[first2];
    first2++;
    index++;
}

for(index = first; index <= last; index++){
    items[index] = temp[index];
    }
}
void IterativeMergeSort(向量和项、int-beginIndex、int-endIndex)
{
if(items.size()<2)
{
返回;
}
其他的
{
int num=endIndex+1;
int mid,对;
对于(int size=1;size=num)
{
mid=num-1;
}
右=左+((2*尺寸)-1);
如果(右>=num)
{
右=num-1;
}
迭代合并(项目、左、中、右);
}
}
}
}
void IterativeMerge(向量和项、整数开始、整数中间、整数结束)
{
向量温度(items.size());
int tempIndex=开始;
int leftIndex=start;
int rightIndex=mid+1;

虽然(leftIndex您是如何初始化向量的?列表中有多少项?它们被初始化为随机顺序整数,在0和给定大小之间没有重复项。例如,大小10,0到9。对于给定结果,向量大小为10000您包含了大量排序代码,但忽略了发布您正在设置的测试装备对于排序,以及您用于测量性能的方法和代码,请注意,如果您在每次插入时对已排序的子序列使用二进制搜索,则插入排序可以显著改进。谢谢,我将使用用于测量运行时的代码更新问题。
void InsertSort(vector<int> &items, int beginIndex, int endIndex)
{
for(int place = 1; place < items.size(); place++)
{
    int temp = items[place];
    int i = place;
    while ((i > 0) && (items[i - 1] > temp))
    {
        items[i] = items[i - 1];
        i--;
    }
    items[i] = temp;
    }
}
void PrintArray(const vector<int> &, string name);
void InitArray(vector<int> &, int randMax);
int elapsed(timeval &, timeval &);

int main (int argc, char* argv[])
{
    int size = 10000;
    vector<string> sorts = {"QuickSort", "InsertSort", "BubbleSort", "IterativeMergeSort", "MergeSort"};
    for(int j = 0; j < sorts.size(); j++)
    {
    string sort_name = sorts[j];
    cout << "Sort employed: " << sort_name << endl;
    int sum;
    for(int i = 0; i < 10; i++)
    {
    srand(1);
vector<int> items(size);
InitArray(items, size);

struct timeval startTime, endTime;
gettimeofday(&startTime, 0);

if(sort_name == "MergeSort")
{
    MergeSort(items, 0, size - 1);
}

if(sort_name == "IterativeMergeSort")
{
    IterativeMergeSort(items, 0, size - 1);
}

if(sort_name == "QuickSort")
{
    QuickSort(items, 0, size - 1);
}

if(sort_name == "BubbleSort")
{
    BubbleSort(items, 0, size - 1);
}

if(sort_name == "InsertSort")
{
    InsertSort(items, 0, size - 1);
}

gettimeofday(&endTime, 0);
int elapsed_secs = elapsed(startTime, endTime);


    sum+=elapsed_secs;
}
    sum /= 10;
    cout << "Average: " << sum << endl;
}
return 0;
}

void InitArray(vector<int> &array, int randMax)
{
int size = array.size();
for(int i = 0; i < size;)
{
    int tmp = (randMax == -1) ? rand() : rand() % randMax;
    bool hit = false;
    for (int j = 0; j < i; j++)
    {
        if (array[j] == tmp)
        {
            hit = true;
            break;
        }
    }
    if(hit)
    {
        continue;
    }
    array[i] = tmp;
    i++;
}
}

void PrintArray(const vector<int> &array, string name)
{
int size = array.size();

for(int i = 0; i < size; i++)
    cout << name << "[" << i << "] = " << array[i] << endl;
}

int elapsed(timeval &startTime, timeval &endTime)
{
return (endTime.tv_sec - startTime.tv_sec) * 1000000
+ (endTime.tv_usec = startTime.tv_usec);
}