簡體   English   中英

C ++中的mergesort

[英]mergesort in C++

#include "stdafx.h"
#include <iostream>

using namespace std;
using namespace System;

void mergesort(int a[], int p, int r);
void merge(int a[], int p, int q, int r);
int main(array<System::String ^> ^args)
{
    int result[2] = { 1, 0 };
    int *p;
    p = result;
    mergesort(p, 0,1);
    while (1);
    return 0;
}

void mergesort(int a[],int p, int r)
{
    if (p < r)
    {
        int q = (p + r) / 2;
        mergesort(a, p, q);
        cout << endl;
        mergesort(a, q + 1, r);
        cout << endl;
        merge(a,p,q,r);
        for (int i = 0; i < 2; i++)
        {
            cout << a[i] << " ";
        }
        cout << endl;
    }
}

void merge(int a[], int p, int q, int r)
{
    int left[100] = {};
    int right[100] = {};
    for (int i = 0; i < (q - p + 1); i++)
    {
        left[i] = *(a + p + i);
        left[i + 1] = 999;
    }
    for (int i = 0; i < (r - q); i++)
    {
        right[i] = *(a + q + 1 + i);
        right[i + 1] = 999;
    }
    for (int k = p; k < r+1; k++)
    {
        int i = 0;
        int j = 0;
        if (left[i] <= right[j])
        {
            a[k] = left[i++];
        }
        else
        {
            a[k] = right[j++];      **// it always goes into this route? why does not left[i]<=right[j] work?**
        }
    }
}

這是我有關基本合並排序的代碼。 我無法在合並功能中輸入第一個IF語句。 為什么if (left[i] <= right[j])不起作用? 我已經嘗試過,可能left[i]時間left[i]都是這樣。 該程序只是轉到else語句。

for (int k = p; k < r+1; k++)
{
    int i = 0;
    int j = 0;
    if (left[i] <= right[j])
    {
        a[k] = left[i++];
    }
    else
    {
        a[k] = right[j++];      **// it always goes into this route? why does not left[i]<=right[j] work?**
    }
}

這並沒有按照您的想法做。 它將始終將left[0]right[0] ,因為您在for循環中聲明了ij ,因此它們在每次迭代時都將重置為0。

為了使它們保留其值,請在循環外部聲明它們:

int i = 0;
int j = 0;
for (int k = p; k < r+1; k++)
{
    if (left[i] <= right[j])
    {
        a[k] = left[i++];
    }
    else
    {
        a[k] = right[j++];      **// it always goes into this route? why does not left[i]<=right[j] work?**
    }
}

如果您的意圖是僅在循環中使用變量i和j,請嘗試執行以下操作以將i和j的范圍限制為循環。

for (int k = p, i = 0, j = 0; k < r+1; k++)
{
    if (left[i] <= right[j])
    {
        a[k] = left[i++];
    }
    else
    {
        a[k] = right[j++];      
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM