2016-04-09 12 views
-2

MergeSort işlevimde neyin yanlış olduğunu anlayamıyorum.Birleştirme Sıralama Algoritması?

void Merge(int* A, int p, int q, int r) 
{ 
    int B[100], i = 0, j = 0, k = 0; 

    i = p; 
    k = p; 
    j = q + 1; 

    while (i <= q && j <= r) 
    { 
     if (A[i] <= A[j]) 
     { 
      B[k] = A[i]; 
      k++; 
      i++; 
     } 

     else 
     { 
      B[k] = A[j]; 
      k++; 
      j++; 
     } 
    } 

    while (i <= q) 
    { 
     B[k] = A[i]; 
     k++; 
     i++; 
    } 

    while (j <= r) 
    { 
     B[k] = A[j]; 
     k++; 
     j++; 
    } 

    for (i = p; i < r; i++) 
    { 
     A[i] = B[i]; 
    } 
} 


void MergeSort(int A[], int p, int r) 
{ 
    int q; 

    if (p < r) 
    { 
     q = (p + r)/2; 
     MergeSort(A, p, q); 
     MergeSort(A, q + 1, r); 
     Merge(A, p, q, r); 
    } 
} 


int main(void) 
{ 
    int N[10]; 

    N[0] = 4; 
    N[1] = 5; 
    N[2] = 8; 
    N[3] = 12; 
    N[4] = 7; 
    N[5] = 3; 
    N[6] = 23; 
    N[7] = 1; 
    N[8] = 90; 
    N[9] = 26; 

    MergeSort(N, 0, 9); 

    for (int i = 0; i < 10; i++) 
    { 
     cout << N[i] << endl; 
    } 
} 

Programın çıktısı: 1, 3, 1, 4, 5, 7, 7, 7, 26, 26, besbelli yanlıştır Bu benim kodudur. Ancak sadece kodda neyin yanlış olduğunu görmüyorum, bana her şey güzel gözüküyor. Bazı C++ kodlarını MargeSort'a yönettim ve hata ayıklamaya çalıştım ama hata bulamıyorum. Onu gören var mı?

// doğru (;; i < r i ++ i = p) için: için (i

// err: Eğer = cevapsız için

+1

Hata ayıklayıcısını kullanmayı düşündünüz mü? –

+1

Ayrıca, önce 5 sayı veya 3 sayı ile denemelisiniz. Bu verilerle çalışamazsa, 10 sayı için işe yaramaz. – PaulMcKenzie

+0

* Bazı C++ kodları MergeSort * 'ı goole - [bu?] Buldunuz mu? (Http://stackoverflow.com/questions/24650626/how-to-implement-classic-sorting-algorithms-in-modern-c) – PaulMcKenzie

cevap

2

// son yılında, sadece bir err var p = i < = r; i ++)

#include <iostream> 
using namespace std; 
void Merge(int* A, int p, int q, int r) 
{ 
    int B[100], i = 0, j = 0, k = 0; 
    i = p; 
    k = p; 
    j = q + 1; 
    while (i <= q && j <= r) 
    { 
     if (A[i] <= A[j]) 
     { 
      B[k] = A[i]; 
      k++; 
      i++; 
     } 
     else 
     { 
      B[k] = A[j]; 
      k++; 
      j++; 
     } 
    } 

    while (i <= q) 
    { 
     B[k] = A[i]; 
     k++; 
     i++; 
    } 

    while (j <= r) 
    { 
     B[k] = A[j]; 
     k++; 
     j++; 
    } 

    for (i = p; i <= r; i++) 
    { 
     A[i] = B[i]; 
    } 
} 

void MergeSort(int A[], int p, int r) 
{ 
    int q; 

    if (p < r) 
    { 
     q = (p + r)/2; 
     MergeSort(A, p, q); 
     MergeSort(A, q + 1, r); 
     Merge(A, p, q, r); 
    } 
} 


int main(void) 
{ 
    int A[10]={9,8,7,6,5,4,3,2,1,0}; 
    MergeSort(A,0,9); 
    for (int i = 0; i<10; i++) 
    { 
     cout<<A[i]<<","; 
    } 
} 

// bilgisinin kod temizlenir versiyon:

#include <iostream> 
using namespace std; 
void Merge(int* A, int p, int q, int r) 
{ 
    int* B=new int[r-p+1]; 
    int i = p; 
    int j = q + 1; 
    int k = 0; 
    while (i <= q && j <= r) B[k++] = (A[i] <= A[j])? A[i++] : A[j++]; 
    while (i <= q) B[k++] = A[i++]; 
    while (j <= r) B[k++] = A[j++]; 
    for (i = p; i <= r; i++) A[i] = B[i-p]; 
    delete B; 
} 
void MergeSort(int* A, int p, int r) 
{ 
    if (p >= r) return; 
    int q = (p + r)/2; 
    MergeSort(A, p, q); 
    MergeSort(A, q + 1, r); 
    Merge(A, p, q, r); 
} 
int main(void) 
{ 
    int A[15]={10,11,12,13,14,0,8,7,6,5,4,3,2,1,9}; 
    MergeSort(A,0,14); 
    for (int i = 0; i<15; i++) cout<<A[i]<<","; 
} 

// bu a, nother yanıt:

#include <iostream> 
#include <climits> 
using namespace std; 
static void Merge(int* A, int p, int q, int r) 
{ 
    int n1 = q - p + 1;// A[p..q] 
    int n2 = r - q;// A[q+1..r] 
    int* L = new int[n1 + 1]; 
    int* R = new int[n2 + 1]; 
    int i, j; 
    for (i = 0; i < n1; i++) 
     L[i] = A[p + i]; 
    for (i = 0; i < n2; i++) 
     R[i] = A[q + i+1]; 
    L[n1] = INT_MAX; 
    R[n2] = INT_MAX; 
    i = 0; 
    j = 0; 
    for (int k = p; k <= r; k++) 
     A[k] = L[i] <= R[j] ? L[i++] : R[j++]; 
    delete L; 
    delete R; 
} 
static void Ascending(int* A, int p, int r) 
{ 
    if (p >= r) return; 
    int q = (p + r)/2; 
    Ascending(A, p, q); 
    Ascending(A, q + 1, r); 
    Merge(A, p, q, r); 
} 
int main() 
{ 
    int A[10]={9,8,7,6,5,4,3,2,1,0}; 
    Ascending(A,0,9); 
    for (int i = 0; i<10; i++) 
    { 
     cout<<A[i]<<","; 
    } 
} 
+1

'0x7fffffff 'yerine' INT_MAX 'kullanmalısınız – Dani