01/10/2018, 10:24

Hỏi về Quick Sort

Cho minh hỏi phương pháp quick sort, nếu sắp xếp sính viên tăng dần theo điểm trung bình thì cái left right nên khai bao ở đâu, trong hàm main hay trong struct sinh viên, mấy cai Sort khác mình làm được, còn riêng cái Quick Sort có thêm 2 cái left right nên hơn phức tạp, mọi người gợi ý giúp mình được không.

Vinh Nguyễn viết 12:27 ngày 01/10/2018
tui khai báo trong hàm main rồi nè mà nó báo lỗi biến cục bộ không bắt buộc sử dụng
#include <iostream>
#include <iomanip>
using namespace std;

const int MAX_LIST = 50;

struct HocVien
{
	char hoten[30];
	float diemtoan;
	float diemvan;
	float dtb ;
	
};

struct DanhSachHocVien
{
	HocVien Data[MAX_LIST];
	int sophantu;
};

void nhap(HocVien &x)
{
	cout<<"\nNhap ho ten sv: ";
	cin.ignore();
	cin.getline(x.hoten,30);
	cout<<"\nNhap diem toan: ";
	cin>>x.diemtoan;
	cout<<"\nNhap diem van: ";
	cin>>x.diemvan;
}

void xuat(HocVien x)
{
	x.dtb = (x.diemtoan + x.diemvan)/2;
	cout<<"\nHo ten\tdiem toan\tdiemvan\tdiem trung binh";
	cout<<"\n"<<x.hoten;
	cout<<"\t"<<x.diemtoan;
	cout<<"\t\t"<<x.diemvan;
	cout<<"\t"<<x.dtb  ;
	cout<<endl;
}

void nhapDS(DanhSachHocVien &x)
{
	cout<<"\nNhap so hoc vien trong danh sach: ";
	cin>>x.sophantu;
	cout<<"\nNhap thong tin cho tung hoc vien trong danh sach"<<endl;
	for(int i = 0; i < x.sophantu; i++)
	{
		cout<<"\nNhap thong tin cho hoc vien thu "<<i + 1<<endl;
		nhap(x.Data[i]);
	}
}

void xuatDS(DanhSachHocVien x)
{
	cout<<"\nDanh sach hoc vien co trong danh sach la"<<endl;
		for(int i = 0; i < x.sophantu; i++)
		{
			xuat(x.Data[i]);
		}
}

void QuickSort(DanhSachHocVien &x,int left, int right)
{
	int k;
	k = x.Data[(left + right)/2].dtb;
	int i = left;
	int j = right;
	do{
		while (x.Data[i].dtb < k)
			i++;
		while (x.Data[j].dtb > k)
			j--;
		if(i <= j)
		{
			swap(x.Data[i], x.Data[j]);
			i++;
			j--;
		}
	}while(i < j);
	if(left < j)
		QuickSort(x,left,j);
	if(right > i)
		QuickSort(x, left, right);
		

		
}
int main()
{
	DanhSachHocVien x;
	int left = 0;
	int right = x.sophantu - 1;
	nhapDS(x); 
	cout<<"\n\t\t\tXUAT DANH SACH"<<endl;
	xuatDS(x);
	cout<<"\n\t\t\tDANH SACH TANG THEO DIEM TRUNG BINH"<<endl;
	QuickSort(x, left, right);
	xuatDS(x);
	system("pause");
	return 0;
}

HK boy viết 12:38 ngày 01/10/2018
  • left và right đều là tham số của hàm. Phải khai báo QuickSort(x[], left, right)
  • Hình như bạn chưa hiểu code quicksort. left và right giống như 2 đầu mút trên một đoạn. Xem lại hình trên wiki.
  • Code quicksort của bạn sai,

if(right > i)
QuickSort(x, left, right);

chỗ kia phải là QuickSort(x, i, right).

  • C++ có hàm sort sẵn =)))
Vinh Nguyễn viết 12:36 ngày 01/10/2018

khi post code tui nhầm lỗi i thành left, cái x.sophantu khi khai bao trong hàm main thì ko báo lỗi biễn cục bộ, mà khi khai báo trong hàm nhập thì nó bào lỗi, ko có left right thì bỏ đâu cũng được

HK boy viết 12:31 ngày 01/10/2018

cái x.sophantu khi khai bao trong hàm main thì ko báo lỗi biễn cục bộ, mà khi khai báo trong hàm nhập thì nó bào lỗi, ko có left right thì bỏ đâu cũng được

Thế là thế nào?

20 char…

Vinh Nguyễn viết 12:35 ngày 01/10/2018

vậy này, tui không dùng Quick sort thì nhập danh sách và xuất danh sách bình thường, khai báo số lượng phần tử x.sophantu bỏ trong hàm main() hay trong hàm nhập đều được, còn khi viết hàm Quick sort thì tui phải khải khai báo thêm2 biên left và right.Khi đó khai báo x.sophantu bỏ trong hàm nhập thì nó báo lỗi biến cục bộ gì đó còn khi bỏ vào hàm main thi nó ko báo lỗi và chạy bình thường và sắp xếp đúng.

rogp10 viết 12:31 ngày 01/10/2018

Thực ra bạn chưa cho nhập gì mà đã gán số phần tử cho 1 biến khác nên báo lỗi là phải.

HK boy viết 12:38 ngày 01/10/2018

@Vinh_Nguyen4:
Phải công nhận là chủ thớt đang trong tình trạng “ăn không nên đọi, nói không nên lời”, cả code lẫn lời giải thích của chủ thớt đều tối nghĩa như nhau :v Mỗi lần nhìn thấy code + lời giải thích của thớt mình đều cảm thấy thảm hại…


Theo cmt của @rogp10 thì thớt chưa hề nhập giá trị của x.sophantu, tức là số phần tử đầu vào chưa xác định. Đáng ra phải đưa nhapDS(x) trước khi gán left, right. Mà biến left, right trong main chả để làm cái gi cả, truyền thẳng QuickSort(x, 0, x.sophantu-1) cũng chả chết ai, vì void QuickSort kia chỉ truyền vào tham biến x, còn left, right là tham trị.

Lương Thế Hải viết 12:40 ngày 01/10/2018

Mình thấy video này khá hay bạn có thể tham khảo

Bài liên quan
0