看到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
****************************************************/
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#include
<
cstdlib
>
#include
<
iostream
>
#include
<
string
>
#include
<
sstream
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
namespace
DLink
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//OtherData
struct _tagOtherData
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string s ;
long i ;
};
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
typedef struct _tagOneRawDataItem
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
typedef struct _tagDLinkRaw
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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 ();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
} DLinkRaw ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
_tagOneRawDataItem::_tagOneRawDataItem ()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
mData1 = "" ;
pPrev = NULL ;
pNext = NULL ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
_tagOneRawDataItem::_tagOneRawDataItem ( string data )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
mData1 = data ;
pPrev = NULL ;
pNext = NULL ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
bool _tagOneRawDataItem::operator < ( _tagOneRawDataItem const &other )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return ( this->mData1 < other.mData1 ) ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
_tagDLinkRaw::_tagDLinkRaw ( int size )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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 ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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 )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ( ( i < 1 ) || ( i > mSize ) ) ...{
return NULL ;
}
OneRawDataItem *p = mpHead ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for ( int j = 0 ; j != i ; j++ ) ...{
p = p->pNext ;
}
return p ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void DLinkRaw::print()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for ( int i = 1 ; i <= mSize ; i++ ) ...{
cout << "The " << i << "th item :" << Getith ( i )->mData1 <<endl ;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void DLinkRaw::Swip ( int i , int j )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
OneRawDataItem *p1 , *p2 , *p3 = NULL ;
if ( i == j ) return ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ( i > j ) ...{
int temp = i ;
i = j ;
j = i ;
}
p1 = Getith ( i ) ;
p2 = Getith ( j ) ;
p3 = p2->pNext ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ( j != mSize ) ...{
p2->pNext->pPrev = p1 ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ( i == ( j -1 ) ) ...{
p1->pPrev->pNext = p2 ;
p1->pNext = p2->pNext ;
p2->pNext = p1 ;
p2->pPrev = p1->pPrev ;
p1->pPrev = p2 ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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 ;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void DLinkRaw::Qsort ()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Qsort ( 1 , mSize ) ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void DLinkRaw::Qsort ( int lo , int hi )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ( lo < hi ) ...{
int i = lo , j = hi , m = ( lo + hi ) /2 ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
do ...{
while ( *Getith ( i ) < *Getith ( m ) ) i++ ;
while ( *Getith ( m ) < *Getith ( j ) ) j-- ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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 ) ;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
int
main(
int
argc,
char
*
argv[])
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int size = -1 ;
string s = "" ;
cout << "Please input the item number of the double link raw:" ;
getline ( cin , s ) ;
stringstream ( s ) >> size ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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;
}