2015-02-23 73 views
0

我正在處理一個排序項目和我的快速排序工作與300kb的數據很好,但是當我嘗試排序1mb的數據時,程序給我在Xcode和seg中的壞線程訪問故障:11在終端。Bad線程訪問/ seg故障QuickSort

void SortingCompetition::quicksort(int low, int high) 
{ 
if (high!=low&& high>low) 
{ 

long one=hash[low]; 
long two=hash[high]; 
long three = hash[high/2]; 
    if((one<=two&&one>=three)||(one<=three&&one>=two)) 
    { 
     swap(hash[low], hash[high]); 
     swap(copyOfWords[low], copyOfWords[high]); 
    } 
    else if((three<=one&&three>=two)||(three<=two&&three>=one)) 
    { 

     swap(hash[high/2], hash[high]); 
     swap(copyOfWords[high/2], copyOfWords[high]); 
    } 
    else 
    { 

    } 
    int i=low; 
    int j=high-1; 
    while(i!=j&&i<j) 
    { 
     while(hash[i]<=hash[high]&&i<j) 
     { 
      i++; 
     } 
     while(hash[j]>=hash[high]&&i<j) 
     { 
      j--; 
     } 
     if(i==j||i>j) 
     { 
     } 
     else 
     { 
      swap(hash[i],hash[j]); 
      swap(copyOfWords[i],copyOfWords[j]); 
         } 
     } 
    swap(hash[i],hash[high]); 
    swap(copyOfWords[i], copyOfWords[high]); 
    quicksort(low, j-1); 
    quicksort(j+1, high); 
} 

散列和copyofwords都動態分配到相同的大小。我不知道如何解決這個問題。在此先感謝

回答

0

它是一種遞歸方法。所以你用這些調用溢出堆棧。

無論何時您調用一個函數(包括遞歸),返回地址和參數通常會被壓入調用堆棧。堆棧是有限的,所以如果遞歸太深,你最終會用完堆棧空間。

+0

有沒有辦法阻止? – Anonymous 2015-02-23 19:35:16

+0

您可以將其翻譯爲迭代算法。每個遞歸算法都可以用交互模式表示。 – amchacon 2015-02-23 19:39:50

+0

謝謝,我的編譯器有問題,我研究迭代,但沒有時間來實現它。 – Anonymous 2015-02-26 00:06:37