Announcement

Collapse
No announcement yet.

Giải thích giùm đoạn mã này trong merge sort

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Giải thích giùm đoạn mã này trong merge sort

    Trong quá trình làm thì e thấy có 1 mẫu chương trình merge sort như thế này:
    và nghĩ hoài vẫn không biết nó đã như thế nào mà cho kết quả đúng:

    Code:
    #include "Header.h"
    
    void merge(int a[],int left,int mid,int right)
    {
    	//cap nhat dong mang da sap xep,mang temp la de chua gia tri mang moi
    	int *temp=new int [right-left+1];		//vi day la tong so pt 2 mang cong lai
    	int dem=0;
    	int i=left,	j=mid+1;
    	///////////////////////////////buoc so sanh tu cap cap vs nhau//////////////////////////////kho hieu
    	while (!(i>mid && j>right))	{
    		if(i<=mid && j<=right	&& a[i] < a[j]	||	j>right)
    			temp[dem++]=a[i++];
    		else 
    			temp[dem++]=a[j++];
    	}
    	for (i=0;i<dem;i++)		//nap tu mang tam vao mang that
    		a[left+i]=temp[i];
    	
    	delete []temp;
    }
    
    void merge_sort(int a[], int left, int right)
    {
    	if(left<right)
    	{
    		int mid=(left+right)/2;
    		//sap xep mang tu chi so trai:->mid	:de qui
    		merge_sort(a,left,mid);	
    		//sap xep tu mid->phai	:recursion
    		merge_sort(a,mid+1,right);
    		//noi lai cho dung
    		merge(a,left,mid,right);
    
    	}
    
    }
    
    
    int main()
    {
    	srand(time(0));
    	int a[100];
    	for (int i=0;i<100;i++)
    	{
    		a[i]=rand();
    	}
    	merge_sort(a,0,99);
    	//xuat 
    	for (int i=0;i<100;i++)
    	
    		cout<<a[i]<<"	";
    	
    	
    	getch();
    	return 0;
    }
    Code:
    while (!(i>mid && j>right))	{
    		if(i<=mid && j<=right	&& a[i] < a[j]	||	j>right)
    			temp[dem++]=a[i++];
    		else 
    			temp[dem++]=a[j++];
    	}
    xin nhờ giải thích vì đoạn chương trình này e thấy dù sao nó vẫn dễ hiểu hơn các đoạn merge sort khác
    và thắc mắc nữa là:
    Em học chuỗi các pp sort này để làm gì?có phải để tăng kĩ năng lập trình hay là phương pháp giải thuật ,liệu các thuật như heap và radix, quick mà các e dc dạy là do ta dc dạy hay là nếu ko ai dạy thì đa phần là chả ai nghĩ ra ko?vì thực sự e thấy muốn nghĩ ra nó chắc phải thông minh lắm ạ?
    Với e có câu hỏi làm thế nào post nhúng cái pastebin vào forum trường mình.e thử dùng mã nhúng của nó vào ko dc
    Last edited by 13520797; 26-03-2014, 18:08.

  • #2
    Originally posted by 13520797 View Post
    Trong quá trình làm thì e thấy có 1 mẫu chương trình merge sort như thế này:
    và nghĩ hoài vẫn không biết nó đã như thế nào mà cho kết quả đúng:

    Code:
    #include "Header.h"
    
    void merge(int a[],int left,int mid,int right)
    {
    	//cap nhat dong mang da sap xep,mang temp la de chua gia tri mang moi
    	int *temp=new int [right-left+1];		//vi day la tong so pt 2 mang cong lai
    	int dem=0;
    	int i=left,	j=mid+1;
    	///////////////////////////////buoc so sanh tu cap cap vs nhau//////////////////////////////kho hieu
    	while (!(i>mid && j>right))	{
    		if(i<=mid && j<=right	&& a[i] < a[j]	||	j>right)
    			temp[dem++]=a[i++];
    		else 
    			temp[dem++]=a[j++];
    	}
    	for (i=0;i<dem;i++)		//nap tu mang tam vao mang that
    		a[left+i]=temp[i];
    	
    	delete []temp;
    }
    
    void merge_sort(int a[], int left, int right)
    {
    	if(left<right)
    	{
    		int mid=(left+right)/2;
    		//sap xep mang tu chi so trai:->mid	:de qui
    		merge_sort(a,left,mid);	
    		//sap xep tu mid->phai	:recursion
    		merge_sort(a,mid+1,right);
    		//noi lai cho dung
    		merge(a,left,mid,right);
    
    	}
    
    }
    
    
    int main()
    {
    	srand(time(0));
    	int a[100];
    	for (int i=0;i<100;i++)
    	{
    		a[i]=rand();
    	}
    	merge_sort(a,0,99);
    	//xuat 
    	for (int i=0;i<100;i++)
    	
    		cout<<a[i]<<"	";
    	
    	
    	getch();
    	return 0;
    }
    Code:
    while (!(i>mid && j>right))	{
    		if(i<=mid && j<=right	&& a[i] < a[j]	||	j>right)
    			temp[dem++]=a[i++];
    		else 
    			temp[dem++]=a[j++];
    	}
    xin nhờ giải thích vì đoạn chương trình này e thấy dù sao nó vẫn dễ hiểu hơn các đoạn merge sort khác
    và thắc mắc nữa là:
    Em học chuỗi các pp sort này để làm gì?có phải để tăng kĩ năng lập trình hay là phương pháp giải thuật ,liệu các thuật như heap và radix, quick mà các e dc dạy là do ta dc dạy hay là nếu ko ai dạy thì đa phần là chả ai nghĩ ra ko?vì thực sự e thấy muốn nghĩ ra nó chắc phải thông minh lắm ạ?
    Với e có câu hỏi làm thế nào post nhúng cái pastebin vào forum trường mình.e thử dùng mã nhúng của nó vào ko dc
    Chỗ đó merge đoạn a[left] -> a[mid] với đoạn a[mid+1] -> a[right] vào trong mảng temp. Cho i chạy từ left, chạy trong đoạn left -> mid, j chạy từ mid +1 chạy trong đoạn mid + 1 -> right. Nhìn chung nó là thế, tuy nhiên đoạn code này còn nhiều điểm không tốt lắm, code trong sách có thể chạy nhanh hơn.

    Học các phương pháp sort xong thì ít nhất em có được cái nhìn về vai trò của thuật toán với nhiều ví dụ khác nhau trong việc giải quyết cùng một bài toán. Những thuật toán này hầu hết đã được nghĩ ra từ hơn nửa thế kỷ hoặc xa hơn nữa.

    Comment


    • #3
      Originally posted by truonganpn View Post
      Chỗ đó merge đoạn a[left] -> a[mid] với đoạn a[mid+1] -> a[right] vào trong mảng temp. Cho i chạy từ left, chạy trong đoạn left -> mid, j chạy từ mid +1 chạy trong đoạn mid + 1 -> right. Nhìn chung nó là thế, tuy nhiên đoạn code này còn nhiều điểm không tốt lắm, code trong sách có thể chạy nhanh hơn.

      Học các phương pháp sort xong thì ít nhất em có được cái nhìn về vai trò của thuật toán với nhiều ví dụ khác nhau trong việc giải quyết cùng một bài toán. Những thuật toán này hầu hết đã được nghĩ ra từ hơn nửa thế kỷ hoặc xa hơn nữa.
      thế nhưng mà sao cái j>right là sao hả thầy?sao nó nhảy ra ngoài mất rùi mà vẫn đúng hả thày.còn cái code trong sách nào hả thầy.e thấy trong quyển ctdl va giai thuật nó viết thiếu mất,kết cục là ko biết làm tiếp sao nữa.

      Comment


      • #4
        Originally posted by 13520797 View Post
        thế nhưng mà sao cái j>right là sao hả thầy?sao nó nhảy ra ngoài mất rùi mà vẫn đúng hả thày.còn cái code trong sách nào hả thầy.e thấy trong quyển ctdl va giai thuật nó viết thiếu mất,kết cục là ko biết làm tiếp sao nữa.
        Đọc code cho kỹ vào. Nếu không tập trung nhìn kỹ được thì tự viết lại cho hiểu
        Last edited by truonganpn; 27-03-2014, 01:44.

        Comment


        • #5
          - Bạn nên cho vài trường hợp sau đó chạy bằng tay trên giấy thì sẽ sáng tỏ ngay. Lúc mình học đọc mấy cái này cũng mù tịt nhưng mà chạy tay xong là hiểu ngay
          Hãy theo đuổi sự ƯU TÚ - THÀNH CÔNG sẽ đến với bạn!

          Comment


          • #6
            Originally posted by truonganpn View Post
            Đọc code cho kỹ vào. Nếu không tập trung nhìn kỹ được thì tự viết lại cho hiểu
            thank thầy,hàng tự chế vẫn ngon hơn.de hiểu cho mình

            Comment

            LHQC

            Collapse
            Working...
            X