Làm sao để sắp xếp nhanh 1 thành phần trong struct

mình muốn sắp xếp mảng[10] kiểu struct Sinhvien theo kiểu sắp xếp quicksort , tiêu chí là điểm average, nhưng không hiểu tại sao bị lỗi trong khi nếu sắp xếp 1 mảng int bình thường thì không bị gì.
dưới đây là code:

#include <conio.h>
 #include <stdio.h> 
#include<stdlib.h>
#include<iostream>
using namespace std; 
typedef struct Sinhvien
{
	char IDclass[40];
	char IDstudent[40];
    char Name[40];
    char Date[40];
    int Average;
};
void Swap(Sinhvien &a,Sinhvien &b)
{Sinhvien v =a ;a = b;b =v;}
 void quicksort(Sinhvien *a,int l,int r)   
{   if(l<=r)                                    
	{                                            
		int i=l;                                     
		int j=r;                                     
		Sinhvien key=a[(l+r)/2];                        
		while(i<=j)                           
		{                                      
		 while(a[i].Average<key.Average)                       
		  i++;                                  
		 while(a[j].Average>key.Average)                       
		  j--;                                
		   if(i<=j)                           
	    	{                                  
	        Swap(a[i],a[j]);                   
	         	i++;
	        	j--;
	        }
		}
	  if(l<j)
		quicksort(a,l,j);
	  if(r>i)
		quicksort(a,i,r);
	}
}
 int main() {  
  Sinhvien mang[10];
  mang[0].Average=4;mang[1].Average=3;mang[2].Average=7;mang[3].Average=12;mang[4].Average=8;mang[5].Average=3;
  mang[6].Average=2;mang[7].Average=5;mang[8].Average=15;mang[9].Average=18;
		  for(int i=0;i<10;i++)
		 {cout<<mang[i].Average<<"  ";
		 }
		 cout<<endl;
	quicksort(mang,0,10);
			  for(int i=0;i<10;i++)
		 {cout<<mang[i].Average<<"  ";
		 }

lỗi là gì thế bác

Hi bạn ,

  • Bạn sai ở truyền vào n-1 chứ ko phải n nha sửa lại : quicksort(mang, 0, 10-1);
  • Nếu không thì bạn xài cách làm sử dụng thư viện “std::sort” nhớ #include <algorithm>
std::sort(std::begin(mang), std::end(mang), [](Sinhvien a, Sinhvien b) {return a.Average > b.Average; });
  • Lưu ý coding style :
  1. Một dòng if thì cũng nên bỏ vào dấu { } nha bạn => mình biết các bạn khi code muốn làm code của mình ngắn để trong thật pro lúc mới đầu code , nhưng nếu các bạn vào một dự án lớn với hạng trăm ngàn file , thì coding style rất quan trọng ! Việc viết code rõ ràng sẽ giúp cho những người khác đọc code của mình dễ dàng hơn , vì khi code dự án lớn không phải chỉ có 1 người làm ! Khoàng 10 đến vài chục người rồi chuyển giao project …v…v…
    vd
if (l < j)
 {
  quicksort(a, l, j);
 } 

=> cho vào ngoặc { }  mặc dù chỉ chứa 1 dòng lệnh.
...
while(a[i].Average<key.Average) => cũng như if nên có  { }
...
while(a[j].Average>key.Average) => cũng như if nên có  { }
...
void Swap(Sinhvien &a,Sinhvien &b) => hàm này bạn nên xuống dòng tất cả các hàng , đừng gôm chung 1 hàng , điều cấm kỵ luôn ấy. 
...
void quicksort(Sinhvien *a,int l,int r)   => đặt tên biến nên rõ nghĩa nha bạn left , right luôn 
...
for(int i=0;i<10;i++) {cout<<mang[i].Average<<" "; } => cái này bạn có thể viết một hàm xuất , để khỏi phải viết lại nhiều lần
...
4 Likes

thanks vì mấy thông tin hữu ích của bác nhá

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?