Khử đệ quy

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi Brianlam, 21/6/06.

  1. Brianlam

    Brianlam T.E.T.Я.I.S

    Tham gia ngày:
    14/7/04
    Bài viết:
    526
    Dạ mấy anh cho em hỏi , làm thế nào để khử đệ quy trên 1 cái Danh sách liên kết cho thuật toán quick sort .
    Theo như tài liệu em coi thì nó trình bày trên mảng như sau :
    1. l:=1 ; r:=n;
    2.Chọn phần tử giữa x:=a[(l+r)div 2];
    3.Phân hoạch (l,r) thành (l1,r1) và (l2,r2) bằng cách : y thuộc (l1,r1) nếu y<=x , y thuộc (l2,r2) nếu ngược lại .
    4. Nếu phân hoạch (l2,r2 ) có nhiều hơn 1 phần tử thì thực hiện :
    -Cất (l2,r2 ) vào stack
    Nếu (l1,r1) có nhiều hơn 1 phần tử thì l=l1,r=r1 Goto 2 .
    Ngược lại :
    -Lấy (l,r) ra khỏi stack nếu stack khác rỗng và Goto 2 .
    Nếu không dừng .
    Em có 1 vài thắc mắc sau :
    1. Mình dùng Danh sách liên kết thì sẽ không chọn được phần tử x chính giữa , do đó phải chọn ở đầu xâu . Vậy ý nghĩa của việc chỉ xét tới (l2,r2) có 1 phần tử và (l1,r1) có 1 phần tử để làm gì ?
    2. Trong thao tác trên , khi mình dùng 1 stack để lưu lại thì làm sao mà mình nối lại tất cả các chuổi con khi không được dùng đệ quy ?
    Có ai giúp dùm em ạ , cái này là 1 bài tập thi mà làm mấy hôm rồi không ra nên mới mạo muội lên đây hỏi ::)
     
  2. hhh_b6[3]

    hhh_b6[3] Youtube Master Race

    Tham gia ngày:
    22/6/06
    Bài viết:
    1
    bạn cho mình hỏi bạn đang theo học ở trường nào thế ^^?
    còn cái vấn đề bạn hỏi thì lâu lắm rùi ko học nên chả nhớ gì nhìu chỉ có thể giúp bạn = đoạn code này thui ^^
    Mã:
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    #include<iostream.h>
    #include<alloc.h>
    #include<conio.h>
    #include<iomanip.h>
    #include<stdio.h>
    #include<stdlib.h>
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    #define thoat 0
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    typedef int elem;
    typedef struct
       node
          {
    	 elem  data;
    	 struct node *next;
          }  nt;
    typedef nt *pt;
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    pt   create();
    int  alloc(pt &tam);
    int  empty(pt list);
    void nhapds(pt & ,pt &);
    int  insertlast(pt &list, pt &last, elem item);
    int  xuat(pt list);
    int  hoanvi(elem &a , elem &b);
    int  sap_xep(pt list);
    int  Chon(pt list);
    void Quicksort(pt &list,pt &last);
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    void main()
       {
          pt  list, last,pred;
          elem  item;
          clrscr();
          cout<<"\n nhap ds thu 1:\n";
          nhapds(list,last);
          cout<<"\n danh  sach  ban  dau  la       : ";
          xuat(list);
    //      cout<<"\n";
    //      cout<<"\n danh  sach  sap xep doi cho la : ";
    //      sap_xep( list);
    //      xuat(list);
    //      cout<<"\n";
    //      cout<<"\n danh sach  sap xep  chon la    : ";
    //      Chon( list);
    //      xuat(list);
          cout<<"\n";
          cout<<"\n danh sach sap xep Quicksort la : ";
          Quicksort(list,last);
          xuat(list);
          getch();
       }
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    // ------------------------------------------------------------------------
    pt  create()
       {
          pt list;
          if(!alloc(list))
    	 return((pt)NULL);
          list->next=(pt)NULL;
          return(list);
       }
    // ------------------------------------------------------------------------
    int alloc(pt &tam)
       {
          if((tam= new nt) == NULL)
    	return 0;
    	return 1;
       }
    // ------------------------------------------------------------------------
    int  empty(pt list)
       {
          return(list==NULL);
       }
    // ------------------------------------------------------------------------
    void  nhapds(pt &list,pt &last)
       {
          elem  item;
          list=last=create();
          cout<<" nhap vao cac gia tri nguyen duong an 0 de thoat: ";
          do
    	 {
    	    cin>>item;
    	    if(item!=thoat)
    //	    insertlast(list,item,last);
    	    insertlast(list,last,item);
    	 }
          while(item!=thoat);
       }
    
    // ------------------------------------------------------------------------
    
    int insertlast(pt &list, pt &last, elem item)
    	{
    		pt temp;
    		if(! alloc(temp))
    			return 0;
    		temp -> data = item;
    		temp -> next = NULL;
    		if(!empty(list))
    			last ->next = temp;
    		else
    			list = temp;
    		last = temp;
    		return 1 ;
    	}
    
    // ------------------------------------------------------------------------
    int  xuat(pt list)
       {
          pt tam;
    //      tam = list->next;
          tam = list;
          while(tam!=NULL)
    	 {
    	    cout<<tam->data<<setw(5);
    	    tam=tam->next;
    	 }
          return 1;
       }
    // ------------------------------------------------------------------------
    int hoanvi(elem &a,elem &b)
       {
          elem t;
          t =  a;
          a =  b;
          b =  t;
          return 1 ;
       }
    // ------------------------------------------------------------------------
    int sap_xep(pt list)
       {
          pt tam,temp;
          tam = list->next;
          while(tam!=NULL)
    	 {
    	    temp =tam->next;
    	    while(temp!=NULL)
    	       {
    		  if(temp->data < tam->data)
    		  hoanvi(temp->data,tam->data);
    		  temp = temp->next;
    	       }
    	    tam  = tam->next;
    	 }
          return 1;
       }
    // ------------------------------------------------------------------------
    int Chon(pt list)
       {
          pt tam,temp1,temp2;
          tam = list->next;
          while(tam!=NULL)
    	 {
    	    temp1 = tam ;
    	    temp2 = tam->next;
    	    while(temp2!=NULL)
    	       {
    		  if(temp1->data > temp2->data)
    		     temp1 = temp2;
    		  temp2 = temp2->next;
    	       }
    	    hoanvi(tam->data,temp1->data);
    	    tam = tam->next;
    	 }
          return 1;
       }
    // ------------------------------------------------------------------------
    void Quicksort(pt &list,pt &last)
       {
          pt temp,x,list1,list2,last1,last2;
          if(list==NULL)
    	 return ;
          list1 = list2 = last1 = last2 = NULL;
          x     = last;
          list  = list->next;
          while(list->next!=NULL)
    	 {
    	    temp = list;
    	    list = list->next;
    	    temp->next= NULL;
    //	    cout<<"Ngoai if : "<<temp->data<<" x = "<<x->data<<"\n";getch();
    	    if(temp->data <= x->data)
    	       {
    		  insertlast(list1,last1,temp->data);
    		  cout<<"if   : "<<temp->data<<" x = "<<x->data<<"\n";getch();
    	       }
    	    else
    	       {
    		  insertlast(list2,last2,temp->data);
    		  cout<<"else : "<<temp->data<<" x = "<<x->data<<"\n";getch();
    	       }
    	 }
          if(list1)
    	    list->next =list1->next;
    //      last1->next= x;
          else
    	 {
    	    list->next = x;
    	    x->next=list2->next;
    	 }
          if(list2)
    	 list->next = list2->next;
          else
    	 last = x;
          cout<<endl;
          cout<<"List1 = ";
          xuat(list1);
          getch();
          cout<<endl;
          cout<<"List2 = ";
          xuat(list2);
          getch();
          cout<<endl;
          cout<<"List = ";
          xuat(list);
          getch();
          cout<<endl;
          cout<<"Phan hoach xong ";getch();
    //      Quicksort(list1,last1);
    //      Quicksort(list2,last2);
    //      cout<<"x = "<<x->data<<endl;getch();
        }
    // -----------------------------------END----------------------------------
    
    
    
    
    
     
  3. ZeroCrazy

    ZeroCrazy T.E.T.Я.I.S

    Tham gia ngày:
    8/4/06
    Bài viết:
    516
    Nơi ở:
    hỏi làm chi ?
    Ặc ... mã của bác quả thiệt cao siêu, tui đọc chả hiểu gì cả. Đây là cách giải của tui.
    Mã:
    void QuickSort(List list)
    {
    	Node *first, *last;
    	Node *i, *j;
    	int x;
    	first = list.first;
    	last  = NULL;
    	// find last element
    	for(i = list.first; i != NULL; i = i->next)
    		last = i;
    	if(last == NULL) return;
    
    	Stack<Node*> s;
    	s.Push(first);
    	s.Push(last);
    	while( !s.IsEmpty() ) {
    		s.Pop(last);
    		s.Pop(first);
    		
    		x = last->value;
    		Node t;
    		t.next = first;
    		i = &t;
    		j = first;
    
    		// bo qua cac phan tu nho hon x
    		while(j->value < x) { 
    			i = i->next;
    			j = j->next;
    		}
    
    		for( ; j != last; j = j->next) {
    			if(j->value <= x) {
    				i = i->next;
    				Swap(i->value, j->value);
    			}
    		}
    		if(i != &t && i != first) {
    			s.Push(first);
    			s.Push(i);
    		}
    		i = i->next;
    		if(i != last) {
    			Swap(i->value, last->value);
    			i = i->next;
    			if(i != last) {
    				s.Push(i);
    				s.Push(last);
    			}
    		}		
    	}
    }
    
     

Chia sẻ trang này