Java双向链表快速排序_双向链表的快速排序

#include

#include

#include

//定义类型 所有的排序例子中都是用的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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值