01/10/2018, 10:25
Thuật toán merge sort không sort được mảng
void merge(int* arr, int left, int mid, int right){
int n1 = mid - left + 1;//số lượng phần tử của mảng trái
int n2 = right - mid; // số lượng phần tử của mảng phải
int tmp1[n1], tmp2[n2];
int i = 0, j = mid + 1;
while(i < n1){
tmp1[i] = arr[i];
i++;
}
i = 0;
while(i < n2){
tmp2[i] = arr[j + i];
i++;
}
i = 0, j = 0;
int count = 0;//số lượng phần tử của mảng chính
while(i < n1 && j < n2){
if(tmp1[i] > tmp2[j]){
arr[count] = tmp2[j];
j++;
}
else{
arr[count] = tmp1[i];
i++;
}
count++;
}
while(i < n1){
arr[count] = tmp1[i];
i++;
count++;
}
while( j < n2){
arr[count] = tmp2[j];
j++;
count++;
}
}
void mergesort(int* arr, int left, int right){
int mid = (left + right) / 2;
if(left < right){
mergesort(arr, left, mid);
mergesort(arr, mid + 1, right);
merge(arr, left, mid, left);
}
}
đây là code Merge sort. Các anh có thể fix dùm em lỗi không ví dụ arr[5] = {2, 1, 5, 4, 3}; chạy trên ubuntu thì vẫn trả về 2 1 5 4 3 còn qua windows chạy visual debug thì nó nói mảng tmp1, tmp2 không có số phần tử xác định? không biết code em có sai gì không mong đc sự giúp đỡ!
Bài liên quan
Chỗ này sai nè. Phải là
merge(arr, left, mid, right)
chứ.Góp ý: Không cần để mid làm tham trị. Có thể gán
mid = (right + left) / 2
ở trongvoid merge()
.Ok anh! em fix thì nó vẫn còn sai giải thuật phiền anh có thể tìm lỗi sai đc không! giải khi em qua merge sort khi fix lại là: 1 3 4 3 5
Bạn đọc đoạn này sẽ thấy bạn không cần phải gán
tmp2[i] = arr[j + i]
mà bạn gán thẳng vàoarr[j]
luôn, và nhớ tăng j.Góp ý: Đoạn code mình vừa quote của bạn hơi khó nhìn một chút, bạn có thể cải tiến mà không cần dùng while với nhiều biến phức tạp:
em tìm ra lỗi sai rồi anh lỗi rất nhiều cảm ơn anh!