01/10/2018, 00:23
Em không hiểu lắm mong mọi người giúp đỡ
#include <iostream>
#include <cstdlib>
using namespace std;
void Quick_sort(int M[], int first, int last)
{
int temp;
int i = first;
int j = last;
int MID = M[(first + last) / 2];
if (first >= last)
{
return;
}
do
{
cout << M[(first + last) / 2] << " " << MID << endl;
while (M[i] < M[(first + last) /2])
++i;
while (M[j] > M[(first + last) / 2])
--j;
if (i <= j)
{
temp = M[i];
M[i] = M[j];
M[j] = temp;
++i; --j;
}
} while (i <= j);
Quick_sort(M, first, j);
Quick_sort(M, i, last);
return;
//if (-1)
//{
//in:
// for (int l = 0; l < 3000; ++l)
// cout << M[l] << endl;
// return;
//}
}
int main()
{
int M[200];
srand(time(NULL));
for (int i = 0; i < 200; ++i)
{
M[i] = 1 + rand() % 499;
}
Quick_sort(M, 0, 199);
/*for (int i = 0; i < 200; ++i)
{
if (M[i] < M[i - 1])
cout << "loi" << endl;
else
cout << "ngon" << endl;
}*/
system("pause");
return 0;
}
Kết quả
tại sao em cùng xuất giá trị int MID = M[(first + last) / 2]; lại khác với giá tri của M[(first + last) / 2] ạ
mong mọi người giải thích giúp
Bài liên quan
đoạn này trong vòng lặp chính là câu trả lời cho bạn, giá trị MID = M[(first + last) / 2]; bạn tính lúc đầu tại vị trí (first + last) / 2 và lúc bạn tính trong vòng lặp đã bị thay đổi do cái if trên
bạn có thể nói rõ hơn không ?
mình có thấy câu lệnh nào làm thay đổi giá trị first hay last gì đâu
chỉ có gán nó cho i và j thôi mà
chưa hiểu câu hỏi.
MID = M[(first + last) / 2]: thấy được đoạn code này.
M[(first + last) / 2] --> còn cái này là ở chỗ nào.
Chính là đoạn này đấy.
Bạn tìm hiểu thêm về đệ quy đi.
Giờ em chịu khó chạy debug.
Cho giá trị khoảng 10 chữa số rồi tự debug trên máy tính và tự debug trên giấy.
đúng là first và last không đổi, nên (first + last)/2 cũng không đổi, nhưng cái if mà mình post ở trên sẽ làm thay đổi tại vị trí i và j nằm giữa 2 first và last, nên có thể thay đổi M tại vị trí i = (first + last)/2 hoặc j = (first + last)/2. Hiểu chứ
hai dòng này nó như nhau sao mà do đệ quy được
gọi đệ quy cùng 1 giá trị mà
chắc là bạn đúng rồi
mình đã thử cho dòng
int MID = M[(first + last) / 2];
vào trong vòng do while và giá trị nó xuất ra là như nhau !!