#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义类型 所有的排序例子中都是用的int作为data
typedef int elemType;     
//返回值
#define RET_SUCCESS   ( 1  ) 
#define RET_FAILED   ( 0  )  
//定义链表的长度
#define  LIST_MAX_SIZE      (10)
//定义链表申请内存不够时报错信息
#define NO_MEMORY   printf("Error! Not enough memory!/n");exit(1)
//双向链表结构体定义
typedef struct tagDuNode_t
{
 elemType data;     
 struct tagDuNode_t * pstNext; 
 struct tagDuNode_t * pstPrior;
}duNode_t;
//初始化双向链表
int initDuList(duNode_t ** pstHead)
{
 int iRet = RET_SUCCESS;
 int iCir = 0;
 duNode_t * pstTmp1 = NULL;
 duNode_t * pstTmp2 = NULL;
 
 //初始化头节点
 * pstHead = (duNode_t *)malloc(sizeof(duNode_t));
 (* pstHead)->pstPrior = NULL;
 (* pstHead)->pstNext = NULL;
 if ( !pstHead )
 {
  NO_MEMORY;
 }
 pstTmp1 = * pstHead;
 //链表初始化
 srand( time(NULL) );//随机数
    for( iCir = 0; iCir < LIST_MAX_SIZE; iCir++ )
 {
  pstTmp2 = (duNode_t *)malloc(sizeof(duNode_t));
  if ( !pstTmp2 )
  {
   NO_MEMORY;
  }
  //赋初值
  pstTmp2->data = rand() % LIST_MAX_SIZE;
  pstTmp2->pstNext = NULL;
  pstTmp1->pstNext = pstTmp2;
  pstTmp2->pstPrior = pstTmp1;
  pstTmp1 = pstTmp2;
 } 
 return iRet;
}
// 打印链表 链表的data元素是可打印的整形    
int showDuList(duNode_t * pstHead)
{
 int iRet = RET_SUCCESS;
 duNode_t * pstTmp = pstHead->pstNext;
 if ( NULL == pstHead )
 {
  printf("链表的头节点是空/n");
  iRet = RET_FAILED;
 }
 else
 {
  while ( pstTmp )
  {
   printf("%d ", pstTmp->data);
   pstTmp = pstTmp->pstNext;
  }
  printf("/n");
 }
 return iRet;
}
/* 删除包括头节点在内的所有的节点. 07/04/28  */
int destroyList(duNode_t * pstHead)
{
 duNode_t * pstTmp = NULL;   /* Temp pointer for circle  */
 int iRet = RET_SUCCESS;
 if ( !pstHead )
 {
  printf("Error! pstHead is null/n");
  iRet = RET_FAILED;
 }
 else
 {
  while ( pstHead )  /* Free  nodes      */
  {
   pstTmp = pstHead;
   pstHead = pstHead->pstNext;
   free(pstTmp);
  }
  pstHead = NULL;
 }
 return iRet;
}/* End of destroyList----------------------------------------------*/
//正确的快速排序 2007/05/09
/*
 一趟快速排序的具体做法是:附设两个指针low和high(即第一个和最后一个指针),
 他们的初值分别为low和high设枢轴(一般为low的值pivot)记录的关键字
 (即本例子中的整形data)为pivot,则首先从high所指位置
 起向前搜索到第一个关键字小于pivot的记录和枢轴记录交换,然后从low所指位置起
 向后搜索,找到第一个关键字大于pivot的记录和枢轴记录相互交换,重复这两步直
 至low = high为止。
*/
duNode_t * partion(duNode_t * pstHead, duNode_t * pstLow, duNode_t * pstHigh)
{
 elemType iTmp = 0;
 elemType pivot = 0;
 if ( !pstHead )
 {
  printf("错误,头节点为空!/n");
  exit(1);
 }
 if ( !pstHead->pstNext )
 {
  return pstHead->pstNext;//就一个元素
 } 
 pivot = pstLow->data;
 while ( pstLow != pstHigh )
 {
  //从后面往前换
  while ( pstLow != pstHigh && pstHigh->data >= pivot )
  {
   pstHigh = pstHigh->pstPrior;
  }
  //交换high low
  iTmp = pstLow->data;
  pstLow->data = pstHigh->data;
  pstHigh->data = iTmp;
  //从前往后换
  while ( pstLow != pstHigh && pstLow->data <= pivot )
  {
   pstLow = pstLow->pstNext;
  }
  //交换high low
  iTmp = pstLow->data;
  pstLow->data = pstHigh->data;
  pstHigh->data = iTmp;
 }
 return pstLow;
}
//快排
void quick_sort(duNode_t * pstHead, duNode_t * pstLow, duNode_t * pstHigh)
{
 duNode_t * pstTmp = NULL;
 pstTmp = partion(pstHead, pstLow, pstHigh);
 if ( pstLow != pstTmp )
 {
  quick_sort(pstHead, pstLow, pstTmp->pstPrior);
 }
 if ( pstHigh != pstTmp )
 {
  quick_sort(pstHead, pstTmp->pstNext, pstHigh);
 }
 
}
void main()
{
 duNode_t * pstHead = NULL;
 duNode_t * pstHigh = NULL;
 duNode_t * pstTmp = NULL;
 initDuList(&pstHead);   //初始化
 printf("Before sorting:/n");
 showDuList(pstHead);   //打印
 pstTmp = pstHead->pstNext;
 while ( pstTmp->pstNext )
 {
  pstTmp = pstTmp->pstNext;
 }
 pstHigh = pstTmp;//找到最后一个节点的指针用于快排时
 quick_sort(pstHead, pstHead->pstNext, pstHigh);//快排序
 printf("After sorting:/n");
 showDuList(pstHead);
 destroyList(pstHead);
 pstHead = NULL;
}


posted on 2012-07-05 19:32  未雨愁眸  阅读(923)  评论(0编辑  收藏  举报