双向链表上的快速排序的C++实现

看到Google Answers有人求在双向链表上的快速排序的C++实现,就随手写了一个。

<script type="text/javascript" src="http://ads.adbrite.com/mb/text_group.php?sid=170596&col=3&br=1"></script>

 
/****************************************************
This is a program to implement the Quick-Sort on a
double link raw .
09/14/2006   coded by dragonxie  
***************************************************
*/


#include 
< cstdlib >
#include 
< iostream >
#include 
< string >
#include 
< sstream >

using   namespace  std;

namespace  DLink  {

//OtherData
struct _tagOtherData
{
    
string s ;
    
long i ;
}
;

typedef 
struct _tagOneRawDataItem
{
    
string  mData1;
    _tagOtherData mOtherdata ;
    
    
// Pointers
    struct _tagOneRawDataItem *pPrev;
    
struct _tagOneRawDataItem *pNext;
    
    
//some fuctions
    
    _tagOneRawDataItem ();
    _tagOneRawDataItem ( 
string data ) ;
    
    
//less-than if the item is less than the other returns true 
    bool operator < ( _tagOneRawDataItem const &other ) ;
    
}
 OneRawDataItem;

typedef 
struct _tagDLinkRaw
{
    OneRawDataItem 
*mpHead ; //point to the head of the link
    int mSize ; // the link's size 
    
    
//some fuctions
    
    _tagDLinkRaw ( 
int size ) ;
    
       
//get the ith item
       OneRawDataItem * Getith ( int i ) ;
       
    
//swip swip the ith item with the jth .
    void Swip ( int i , int j ) ;
    
    
//QuickSort fuction
    void Qsort ( int lo , int hi ) ;
    
void Qsort () ;
    
    
//print
    void print ();

}
 DLinkRaw ;

_tagOneRawDataItem::_tagOneRawDataItem ()
{
    mData1 
= "" ;
    pPrev 
= NULL ;
    pNext 
= NULL ;
}


_tagOneRawDataItem::_tagOneRawDataItem ( 
string data )
{
    mData1 
= data ;
    pPrev 
= NULL ;
    pNext 
= NULL ;
}


bool _tagOneRawDataItem::operator < ( _tagOneRawDataItem const &other )
{
     
return ( this->mData1 < other.mData1 ) ;
}


_tagDLinkRaw::_tagDLinkRaw ( 
int size )
{
    mSize 
= size ;
    
string key = "" ;
    mpHead 
= new OneRawDataItem ;
    
if ( 0 == size ) return ;  
    
    cout
<<"Please input the key of the 1st item :" ;
    cin
>>key ;
    mpHead
->pPrev = mpHead ;
    mpHead
->pNext = new OneRawDataItem ( key ) ;
    mpHead
->pNext->pPrev = mpHead ;
    
if ( 1 == size ) return ;
    
    
for ( size = 1 ; size < mSize ; size++ ) {    
        cout
<<"Please input the key of the "<< size + 1 <<"th item :" ;
        cin
>>key ;
        mpHead
->pNext->pPrev = new OneRawDataItem ( key ) ;
        mpHead
->pNext->pPrev->pNext = mpHead->pNext ;
        mpHead
->pNext->pPrev->pPrev = mpHead ;
        mpHead
->pNext = mpHead->pNext->pPrev ;
    }

}

        
OneRawDataItem 
* DLinkRaw::Getith ( int i )
{
    
if ( ( i < 1 ) || ( i > mSize ) ) {
         
return NULL ;
    }

    
    OneRawDataItem 
*= mpHead ; 
    
    
for ( int j = 0 ; j != i ; j++ ) {
        p 
= p->pNext ;
    }

    
return p ;
}


void DLinkRaw::print()
{
     
for ( int i = 1 ; i <= mSize ; i++ ) {
         cout 
<< "The " << i << "th item :" << Getith ( i )->mData1 <<endl ;
     }

}


void DLinkRaw::Swip ( int i , int j )
{
     OneRawDataItem 
*p1 , *p2 , *p3 = NULL ;
     
if ( i == j ) return ;
     
if ( i > j ) {
          
int temp = i ;
          i 
= j ;
          j 
= i ;
     }

      
     p1 
= Getith ( i ) ;
     p2 
= Getith ( j ) ;
     p3 
= p2->pNext ;
     
if ( j != mSize ) {
         p2
->pNext->pPrev = p1 ;
     }

     
if ( i == ( j -1 ) ) {  
         p1
->pPrev->pNext = p2 ;
         p1
->pNext = p2->pNext ;  
         p2
->pNext = p1 ;
         p2
->pPrev = p1->pPrev ;
         p1
->pPrev = p2 ;
     }
 
     
else {
         p1
->pNext->pPrev = p2 ;
         p2
->pPrev->pNext = p1 ;   
         p1
->pPrev->pNext = p2 ;
         p2
->pNext = p1->pNext ;
         p1
->pNext = p3 ;
         p3 
= p1->pPrev ;
         p1
->pPrev = p2->pPrev ;
         p2
->pPrev = p3 ;
     }
        
}


void DLinkRaw::Qsort ()
{
     Qsort ( 
1 , mSize ) ;
}


void DLinkRaw::Qsort ( int lo , int hi )
{
    
if ( lo < hi ) {
        
int i = lo , j = hi , m = ( lo + hi ) /2 ; 
        
do {
            
while ( *Getith ( i ) < *Getith ( m ) ) i++ ;
            
while ( *Getith ( m ) < *Getith ( j ) ) j-- ;
                
if ( i <= j ) {
                     
if ( m == i ) m = j ;
                     
else if ( m == j ) m = i ;
                     Swip ( i , j ) ;
                     i
++ , j-- ;
                }

        }
while ( i <= j ) ;
        Qsort ( lo , j ) ;
        Qsort ( i , hi ) ;
    }

}


}

int  main( int  argc,  char   * argv[])
{
    
int size = -1 ;
    
string s = "" ;
    cout 
<< "Please input the item number of the double link raw:" ;
    getline ( cin , s ) ;
    stringstream ( s ) 
>> size ;
    
while ( size < 0 ) {
          cout 
<< "The size must be above zero ! Please reinput :" ;
          getline ( cin , s ) ;
          stringstream ( s ) 
>> size ;
    }

    DLink::DLinkRaw dlink ( size ) ;
    cout
<<"Before sorting:"<<endl;
    dlink.print();
    dlink.Qsort();
    cout
<<endl<<"After sorting:"<<endl;
    dlink.print();
    system(
"PAUSE");
    
return EXIT_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值