Bir diziyi, başlangıç ve bitiş indislerini hesaplayarak n eşit parçalarına ayırmaya çalışıyorum. Başlangıç ve bitiş öğelerinin adresi, bu dizileri sıralayacak bir işleve geçirilecektir. Örneğin, eğer arraySize = 1000 ve n = 2 ise, endeksler 0, 499, 999 olacaktır. Şimdiye kadar aşağıdaki kodlarım var ama tek n için, n dizisinden daha fazlasına bölüyor. Bunu yapmayı düşündüğüm başka bir yol da döngüde n kere koşmaktır, ama nereden başlayacağımı bilmiyorum.C dizisini n eşit parçalara ayırma
int chunkSize = arraySize/numThreads;
for (int start = 0; start < arraySize; start += chunkSize) {
int end = start + chunkSize - 1;
if (end > arraySize - 1) {
end = arraySize - 1;
}
InsertionSort(&array[start], end - start + 1);
}
DÜZENLEME: Burada ile geldi başka bir şey. Çalışıyor gibi görünüyor, ama daha kapsamlı bir test yapmam gerekiyor. Bunu çok kez çizdim ve el ile takip ettim. Umarım, başarısız olacak herhangi bir kenar durumu yoktur. Zaten n> = arraySize'yi kısıtlıyorum.
int chunkSize = arraySize/numThreads;
for (int i = 0; i < numThreads; i++) {
int start = i * chunkSize;
int end = start + chunkSize - 1;
if (i == numThreads - 1) {
end = arraySize - 1;
}
for (int i = start; i <= end; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
"arraySize = 2, ve n = 2, dizinler 0, 499, 999 olacak" bu pkease üzerinde biraz daha fazla ışık atıyor – nullpointer
Döngü gövdesindeki her satırda + 1'den 'bit'e ekleyebilirsiniz. 'InsertionSort' çağrısında 'end'den 1 çıkartın. 'end = start + chunkSize'; end> arraySize'; 'end = arraySize'; 'InsertionSort (& dizi [başlat], son)'. Böylece bir dolu - 1 ve + 1 gürültü kaybedersiniz. – Kaz
Üzgünüz arraySize, 1000 olacak. – Shan