2014-04-30 36 views
1

我已經實現了以下快速排序算法來排序幾個點(三維空間)。 每一對都定義一條線:目的是將所有距離小於或等於powR的線放在包含所有對的數組中。 包含座標的數組是單調的,每6個元素定義一對,每3個點。快速排序算法就地崩潰後一些迭代

當我運行帶有3099642元素數組的算法時,在處理2799222試圖進入下一次迭代後停止。如果我從元素2799228開始算法,它停在3066300. 我無法弄清楚問題出在哪裏,並提出建議?

void QuickSort(float *array, int from, int to, float powR){ 

float pivot[6]; 
float temp[6]; 

float x1; 
float y1; 
float z1; 
float x2; 
float y2; 
float z2; 
float d12; 

int i; 
int j; 

if(from >= to) 
    return; 

pivot[0] = array[from+0]; 
pivot[1] = array[from+1]; 
pivot[2] = array[from+2]; 
pivot[3] = array[from+3]; 
pivot[4] = array[from+4]; 
pivot[5] = array[from+5]; 

i = from; 

for(j = from+6; j <= to; j += 6){ 

    x1 = pivot[0] - array[j+0]; 
    y1 = pivot[1] - array[j+1]; 
    z1 = pivot[2] - array[j+2]; 
    x2 = pivot[3] - array[j+3]; 
    y2 = pivot[4] - array[j+4]; 
    z2 = pivot[5] - array[j+5]; 
    d12 = (x1*x1 + y1*y1 + z1*z1) + (x2*x2 + y2*y2 + z2*z2); 
/*the sorting condition i am using is the regular euclidean norm*/ 
    if (d12 <= powR){ 
       i += 6; 

       temp[0] = array[i+0]; 
       temp[1] = array[i+1]; 
       temp[2] = array[i+2]; 
       temp[3] = array[i+3]; 
       temp[4] = array[i+4]; 
       temp[5] = array[i+5]; 

       array[i+0] = array[j+0]; 
       array[i+1] = array[j+1]; 
       array[i+2] = array[j+2]; 
       array[i+3] = array[j+3]; 
       array[i+4] = array[j+4]; 
       array[i+5] = array[j+5]; 

       array[j+0] = temp[0]; 
       array[j+1] = temp[1]; 
       array[j+2] = temp[2]; 
       array[j+3] = temp[3]; 
       array[j+4] = temp[4]; 
       array[j+5] = temp[5]; 
    } 
} 

QuickSort(array, i+6, to, powR); 
} 

函數被調用以這種方式: 浮子的LOR =(浮動)釋放calloc((無符號)TOT,的sizeof(浮動));

LORs從文件中填充讀取數據,並且工作正常。

QuickSort(LORs, 0, 6000, powR); 

    free(LORs); 
+2

在函數內部使用調試器或某些打印來查看它的崩潰位置。 – gsamaras

+0

我打印所有我可以,我唯一的信息是,它嘗試進入遞歸迭代與開始索引時崩潰2799228 – user3589951

+0

另外,我建議你使用較少的數字作爲輸入,並說如何調用函數。但什麼是K和至?你忘了我猜的一些代碼。 – gsamaras

回答

1
for(j = from+6; j <= to; j += 6) { 
    array[i+0] = array[j+0]; 
    array[i+1] = array[j+1]; 
    array[i+2] = array[j+2]; 
    array[i+3] = array[j+3]; 
    array[i+4] = array[j+4]; 
    array[i+5] = array[j+5]; 
} 

j + constant_numberout of bounds當你接近結束。這就是爲什麼它最終崩潰。請注意,constant_number是非負數。

j靠近(通過增量步距離可以找到多近的距離,即+6)到數組的末尾時,它肯定會超出範圍。

以簡單的情況下,最大值j可以得到。這是你的數組的大小。 因此,我們稱之爲N.

然後,當j等於N時,您將進入循環。

然後,你想訪問array[j + 0],這實際上是array[N + 0],這是array[N]

我敢肯定,你知道在C(你應該在未來包括您的問題標籤需要)編制索引,是從0到N - 1,等等..

編輯:正如評論所示,這不是一個(快速)排序!

我已經實施了quickSort here,你想對此有所瞭解。我建議你從解釋開始,而不是從代碼開始!

+0

如果它是真的,爲什麼它一直工作到某個遞歸?它不停止在第一個? – user3589951

+0

因爲你很幸運,直到某個時候。然而,你很幸運,因爲你知道你肯定有一個邏輯錯誤。 ;) – gsamaras