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

Quân viết 02:24 ngày 01/10/2018

if (i <= j)
{
temp = M[i];
M[i] = M[j];
M[j] = temp;
++i; --j;
}

đ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

Tớ không giỏi Văn.... viết 02:35 ngày 01/10/2018

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à

vũ xuân quân viết 02:25 ngày 01/10/2018

int MID = M[(first + last) / 2]; lại khác với giá tri của M[(first + last) / 2] ạ

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.

Pham Van Hai viết 02:40 ngày 01/10/2018

Quick_sort(M, first, j);
Quick_sort(M, i, last);

Chính là đoạn này đấy.
Bạn tìm hiểu thêm về đệ quy đi.

vũ xuân quân viết 02:39 ngày 01/10/2018

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.

Quân viết 02:30 ngày 01/10/2018

đú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ứ

Tớ không giỏi Văn.... viết 02:38 ngày 01/10/2018
int MID = M[(first + last) / 2];
M[(first + last) / 2]

hai dòng này nó như nhau sao mà do đệ quy được

gọi đệ quy cùng 1 giá trị mà

Tớ không giỏi Văn.... viết 02:33 ngày 01/10/2018

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 !!

Bài liên quan
0