[Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Phân tích và thiết kế giải thuật.

[Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 15-04-2010, 16:25

Dạo này diễn đàn High Tech quá trù làm 1 cú tổng hợp Low Tech mấy cái giải thuật cơ bản như sắp xếp, tìm kiếm, cùng vài bài ctdl cơ bản, mà thời gian hạn hẹp, bạn nào có thể cùng tham gia không ? Chúng ta có thể list ra rồi cùng implement :D he he.

Chờ các bạn :ym_peace_sign:

@Edit: Ưu tiên các bạn năm nhất, năm hai, chúng ta sẽ cùng làm cùng học :).
CSort.h
Code: Chọn hết
#pragma once
/*
*/
class CSort
{
   public:
      CSort(void);
      ~CSort(void);
      
      template<class T>
      void BubbleSort(T* _list,int n,bool increase );
      
      template<class T>
      void SelectionSort(T* _list,int n,bool increase );
      
      template<class T>
      void InsertionSort(T* _list,int n,bool increase);

      template<class T>
      void ShellSort(T* _list, int n,bool increase);
            
      template<class T>
      void HeapSort(T* _list, int n,bool increase);

      template<class T>
      void QuickSort(T* _list, int n,bool increase);

      template<class T>
      void RadixSort(T* _list, int n,bool increase);

      template<class T>
      void MergeSort(T* _list, int n,bool increase);
   private:
      template<class T>
      void MergeSort_R(T* _list, int _begin, int _end, bool increase);
      template<class T>
      void MergeSort_M(T* _list, int _begin,int _end, bool increase);

      template<class T>
      void QuickSort_R(T* _list, int _begin, int _end, bool increase);

};

CSort::CSort()
{}
CSort::~CSort()
{}

/*
   
*/
template<class T>
void CSort::BubbleSort(T *_list, int n, bool increase)
{
   
}

template<class T>
void CSort::SelectionSort(T* _list,int n,bool increase )
{}

template<class T>
void CSort::InsertionSort(T* _list,int n,bool increase)
{}

template<class T>
void CSort::ShellSort(T* _list, int n,bool increase)
{}
      
template<class T>
void CSort::HeapSort(T* _list, int n,bool increase)
{}



template<class T>
void CSort::RadixSort(T* _list, int n,bool increase)
{
}

template<class T>
void CSort::QuickSort(T* _list, int n,bool increase)
{
   if( n < 2 ) return;
   QuickSort_R(_list, 0, n - 1, increase);
}

template<class T>
void CSort::QuickSort_R(T* _list, int _begin, int _end, bool increase)
{
   int left = _begin;
   int right = _end;

   if( left >= right )
      return ;
   T midleValue = _list[(int)(left + right)/2];

   while( left <= right)
   {
      if( increase == true)
      {
         while(_list[left] < midleValue )
            ++left;
         while(_list[right] > midleValue )
            --right;
      }
      else
      {
         while(_list[left] > midleValue )
            ++left;
         while(_list[right] < midleValue )
            --right;
      }
      if( left <= right )
      {
         if( left < right )
         {
            T tempValue = _list[left];
            _list[left] = _list[right];
            _list[right] = tempValue;
         }
         ++left;
         --right;
      }

   }
   QuickSort_R(_list, _begin, right, increase);
   QuickSort_R(_list, left, _end, increase);


}



/*
   ******************* Mô Tả Giải Thuật Merge Sort *************************
   + Merge Sort áp dụng giải thuật chia để trị để sắp xếp một danh sách
   Giải Thuật :
      + Chia nhỏ dãy cần sắp xếp thành n dãy con khác nhau
      + Sắp xếp n dãy con theo thứ tự tăng (giảm)
      + Trộn n dãy con lại
   Độ phức tạp O(nLg(n))
   Ví Dụ:
   Dãy Cần SX: a = 5,3,4,1,6
   Chia thành 5 dãy gồm : 5 - 3 - 4 - 1 - 6
   Trộn lần lượt : ( 3 - 5), ( 1 - 4 ), (6)
               ( 1 - 3 - 4- 5), (6)
               ( 1 - 3 - 4 - 5 - 6 )
   Dãy đã sắp xếp : 1,3,4,5,6
*/
template<class T>
void CSort::MergeSort(T* _list, int n,bool increase)
{
   if( n > 1 )
      MergeSort_R(_list, 0, n - 1, increase);
}
/*
   ******************* Sắp Xếp Theo MergeSort ***************************
   Giải Thuật:
      + Thực hiện việc sắp xếp các phần bằng đệ quy
      + Chia _list từ _begin đến _end thành 2 phần
      + Sắp xếp 2 phần này theo thứ tự increase
      + Sau đó trộn lại
   Đối Số :
      + _list : Danh sách dữ liệu cần sắp xếp
      + n       : Số phần tử
      + _begin: Chỉ mục bắt đầu xử lý trên _list
      + _end  : Chỉ mục ngừng xử lý trên _list
      + increase: Sắp xếp tăng ?
*/
template<class T>
void CSort::MergeSort_R(T* _list,int _begin, int _end, bool increase)
{
   if ( _end - _begin + 1 < 2) return;
   int middle = (_begin + _end)/2;
   MergeSort_R(_list, _begin, middle, increase);
   MergeSort_R(_list, middle + 1, _end, increase);
   MergeSort_M(_list, _begin, _end, increase);
}

template<class T>
void CSort::MergeSort_M(T* _list,int _begin,int _end, bool increase)
{
   T* temp = new T[_end - _begin + 1];
   // Trộn dữ liệu vào temp
   int _index = 0;
   
   int _indexPart1 = _begin;
   int middle = (_end + _begin)/2;
   int _indexPart2 = middle + 1;
   
   while( _indexPart1 <= middle && _indexPart2 <= _end)
   {
      if( increase == true)
         temp[_index++] = ( _list[ _indexPart1] < _list[ _indexPart2 ] ? _list[ _indexPart1++ ] : _list [ _indexPart2 ++ ]);
      else
         temp[_index++] = ( _list[ _indexPart1] < _list[ _indexPart2 ] ? _list[ _indexPart2++ ] : _list [ _indexPart1 ++ ]);

   }
   while( _indexPart1 <= middle)
      temp[ _index++] = _list[ _indexPart1 ++];
   while( _indexPart2 <= _end )
      temp[ _index++] = _list[ _indexPart2 ++];

   // copy dữ liệu từ temp vào _list
   for(int i = 0; i < _end - _begin + 1; ++i)
   {
      _list[_begin + i] = temp[i];
   }
}



Okie, vậy là ae bận rộn quá rồi. Kid sẽ cố gắng đưa hết ra template và bump chủ đề 1 thời gian. Hi vọng các bạn mới đến với lập trình C/C++, sinh viên năm 1,2 cùng tham gia để chúng ta có thể hoàn thành chuyên mục này.
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post strongangle 15-04-2010, 16:31

:ym_applause: :ym_applause: :ym_applause: :ym_applause:
website cá nhân : http://www.google.com.vn
strongangle
Moderators
 
Bài viết: 551
Tham gia: 18-10-2008, 02:16

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 15-04-2010, 16:59

@Strong Angle: Cảm ơn cậu đã ủng hộ nhé, :) Để lấy chỗ post, và tránh loãng topic tớ sẽ del bài cậu, chắc cậu ko giận tớ hì hì.

Okie, Trở lại với chủ điểm, một điều boăn khoăn là không biết có thiết thực không ?
Vì đối với những bạn đã từng qua thì có lẽ là không có thú vị gì, nhưng với những bạn mới học thì mình nghĩ tham gia cùng làm cùng học thêm sẽ rất hữu ích. Có điều hình như diễn đàn mình ít mấy bạn thế này quá ...

Về Sort chúng ta có :

- Bubble Sort
- Selection Sort
- Insertion Sort
- Quick Sort
- Shell Sort
- Radix Sort
- Merge Sort.
- Heap Sort

Okie, còn gì nữa không nhỉ ?
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post UNS_long 15-04-2010, 18:05

về sort thì cần thế là đủ rồi anh ơi còn vài cái nữa nhưng không cần thiết lắm vì nó là những cái tối ưu từ mấy cái thuật toán anh kiệt kê ở trên. ngoài sort còn thuật toán tìm đường đi thì sao anh nhỉ ?, thuật toán tìm đường đi ngắn nhất, thuật toán tô màu...v..v :ym_peace_sign: . nếu có thể giúp được gi anh cứ kêu em nhé.. :ym_batting_eyelashes:
......::: MR.LONELY :::......

quyết không iu để tiền uống rựu
khắc tên em lên cổ cánh chân gà


...........................BẾ QUAN......................
Hình đại diện
UNS_long
Members
 
Bài viết: 346
Tham gia: 15-07-2009, 14:49
Nơi ở: TPHCM

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 15-04-2010, 19:11

Ui, nếu cậu join được thì hay quá, tớ cũng không có đủ time để làm hết, hay nhất là tớ sẽ cố gắng hỗ trợ + test, viết sẵn template cho các bạn hiện thực. Nếu bên này đủ người thì tớ sẽ chuyển viết mấy tính năng mới trong .net 3.0, sẵn đà tìm hiểu luôn.

Cậu xem thử có bạn nào mới nhập môn muốn học thì join luôn nhé, tớ sẽ cố gắng hỗ trợ.
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 15-04-2010, 19:45

Code: Chọn hết
#include "stdio.h"
#pragma once
/*
*/
class CSort
{
   public:
      CSort(void);
      ~CSort(void);
      
      template<class T>
      void BubbleSort(T* _list,int n,bool increase );
      
      template<class T>
      void SelectionSort(T* _list,int n,bool increase );
      
      template<class T>
      void InsertionSort(T* _list,int n,bool increase);

      template<class T>
      void ShellSort(T* _list, int n,bool increase);
            
      template<class T>
      void HeapSort(T* _list, int n,bool increase);

      template<class T>
      void QuickSort(T* _list, int n,bool increase);

      template<class T>
      void RadixSort(T* _list, int n,bool increase);

      template<class T>
      void MergeSort(T* _list, int n,bool increase);
      
};

CSort::CSort()
{}
CSort::~CSort()
{}

/*
   
*/
template<class T>
void CSort::BubbleSort(T *_list, int n, bool increase)
{
   
}

template<class T>
void CSort::SelectionSort(T* _list,int n,bool increase )
{}

template<class T>
void CSort::InsertionSort(T* _list,int n,bool increase)
{}

template<class T>
void CSort::ShellSort(T* _list, int n,bool increase)
{}
      
template<class T>
void CSort::HeapSort(T* _list, int n,bool increase)
{}

template<class T>
void CSort::QuickSort(T* _list, int n,bool increase)
{}

template<class T>
void CSort::RadixSort(T* _list, int n,bool increase)
{}

template<class T>
void CSort::MergeSort(T* _list, int n,bool increase)
{}


Prototype trước thế này, cậu coi thử nhé. Mỗi khi hiện thực alg nào chúng ta mô tả về nó kĩ tí. :)

Có gfi không đúng cậu cú góp ý tớ fix. Khoản C/C++ cứ gọi là quên sạch :)
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post UNS_long 15-04-2010, 20:23

theo em thay vì mình khai báo template ở cả .h và .cpp thì mình gom file .h và .cpp vô 1 file .h và chỉ khai báo teamplate 1 lần thôi! tránh phải nhập nhiều lần template và có thể mắc 1 số lỗi sai nào đó dẫn tới làm cho ta thấy khó chiu. hihi.. cái cách này là theo như lời khuyên của thầy hưỡng dẫn thực hành của em hồi học lập trình hướng đối tượng.

còn về gọi thêm vài bạn vào nữa thì trước mắt đã có star05051990 (cùng lớp với em mà), có thể thêm vài bạn năm 1 bên trường em nữa. nhưng trước mắt em chỉ có thể nói vậy thui. hii còn tụi nó có nhiệt huyết tham gia hay không thì còn tùy vào bản thân mỗi người nữa.
......::: MR.LONELY :::......

quyết không iu để tiền uống rựu
khắc tên em lên cổ cánh chân gà


...........................BẾ QUAN......................
Hình đại diện
UNS_long
Members
 
Bài viết: 346
Tham gia: 15-07-2009, 14:49
Nơi ở: TPHCM

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 15-04-2010, 22:13

Okie, hay lắm, hi vọng có nhiều mem cùng join cho vui. :)

Kid vừa viết xong Merge Sort, cái duy nhất đến giờ còn nhớ, cái quick sort, radix sort, heap sort thì đi đâu mất tiêu rồi :ym_whew:

Quên nữa, thì vẫn để ở file .h thôi mà. UNS_Long xem lại template ở trên nhé.

Mai kid quăng lên file project rồi cậu code được gì thì làm tiếp nhé.

Về tìm kiếm kid sẽ code BFS DFS A*, những giải thuật khác thật không còn nhớ rõ lắm, nếu cậu phụ được thì okie, mà có nhớ thì list ra giúp nhé ? Quên sạch rồi :ym_blushing:
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post UNS_long 16-04-2010, 03:30

kidkid wrote:Okie, hay lắm, hi vọng có nhiều mem cùng join cho vui. :)

Kid vừa viết xong Merge Sort, cái duy nhất đến giờ còn nhớ, cái quick sort, radix sort, heap sort thì đi đâu mất tiêu rồi :ym_whew:

Quên nữa, thì vẫn để ở file .h thôi mà. UNS_Long xem lại template ở trên nhé.

Mai kid quăng lên file project rồi cậu code được gì thì làm tiếp nhé.

Về tìm kiếm kid sẽ code BFS DFS A*, những giải thuật khác thật không còn nhớ rõ lắm, nếu cậu phụ được thì okie, mà có nhớ thì list ra giúp nhé ? Quên sạch rồi :ym_blushing:


em có thế code giúp anh cái BFS và DFS vì cái này em mới làm xong, nếu có gì em sẽ đưa anh code của em để anh coi rồi sửa lại nếu sai nhé. còn A* em mới tìm hiểu chứ chưa có code nó nên chắc phải nhờ vào anh kid.! mai anh quang project lên đi, em mang về làm mấy cái thuật toán còn lại cho, nhưng nếu nhanh nhất chắc phải 3 tuần nữa vì dạo này em đang ôm 2 cái project lập trình Windows với Mạng máy tính nên ít code liên tục được.
......::: MR.LONELY :::......

quyết không iu để tiền uống rựu
khắc tên em lên cổ cánh chân gà


...........................BẾ QUAN......................
Hình đại diện
UNS_long
Members
 
Bài viết: 346
Tham gia: 15-07-2009, 14:49
Nơi ở: TPHCM

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 16-04-2010, 09:41

Cậu vào đây down về nhé: http://www.mediafire.com/?fdzormouomn
Mạng cùi quá, ko thảo luận được.
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post hocvayeu 16-04-2010, 12:40

kidkid wrote:Cậu vào đây down về nhé: http://www.mediafire.com/?fdzormouomn
Mạng cùi quá, ko thảo luận được.

Có nên để code trực tiếp trên codepro ko? Có thể xem và thảo luận luôn, mà ko nhất thiết phải download về
Cho đi là còn mãi!
Hình đại diện
hocvayeu
Global Moderators
 
Bài viết: 925
Tham gia: 26-05-2009, 02:46

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post UNS_long 16-04-2010, 13:31

hocvayeu wrote:
kidkid wrote:Cậu vào đây down về nhé: http://www.mediafire.com/?fdzormouomn
Mạng cùi quá, ko thảo luận được.

Có nên để code trực tiếp trên codepro ko? Có thể xem và thảo luận luôn, mà ko nhất thiết phải download về


em nghĩ nên làm như anh hocvayeu. mỗi lần post 1 thuật toán, để bà con còn buôn trứng bán vịt cho vui. còn project thì khi nào hoàn thành em sẽ gửi từ từ lên.
......::: MR.LONELY :::......

quyết không iu để tiền uống rựu
khắc tên em lên cổ cánh chân gà


...........................BẾ QUAN......................
Hình đại diện
UNS_long
Members
 
Bài viết: 346
Tham gia: 15-07-2009, 14:49
Nơi ở: TPHCM

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 16-04-2010, 19:10

Post thì có thể post lên, nhưng project thì vẫn cập nhật để test với lại file .h cho tiện.

Cậu rủ mọi người nhé . Viết DFS BFS đi tớ sẽ check.
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post UNS_long 17-04-2010, 07:14

http://www.mediafire.com/?ymjjmlojmhu

đây là bài em viết hồi trước, là 1 bài ứng dụng BFS và DFS. anh kid checks giùm em nhé. còn bài về tìm đường đi ngắn nhất thì vài hôm nữa em xong project em viết rùi post lên nhé.
......::: MR.LONELY :::......

quyết không iu để tiền uống rựu
khắc tên em lên cổ cánh chân gà


...........................BẾ QUAN......................
Hình đại diện
UNS_long
Members
 
Bài viết: 346
Tham gia: 15-07-2009, 14:49
Nơi ở: TPHCM

Re: [Chuyên Mục] Giải Thuật Cơ Bản Cho Beginner

Post kidkid 17-04-2010, 10:01

Ui, cậu viết DFS, BFS như vậy là đúng rồi.

Để tớ viết cái template để cậu implement lại.
Chỗ này có chút rắc rối tí. Đang xem làm sao để tổ chức cho tốt.
Hình đại diện
kidkid
Members
 
Bài viết: 1000
Tham gia: 18-06-2007, 22:47
Nơi ở: In Your Bugs

Tiếp

Trở về Phân tích và thiết kế giải thuật

Ai đang truy cập

Đang xem diễn đàn này: 0 thành viên và 1 khách