双向链表的快速排序

#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 lowiTmp = pstLow->data;pstLow->data = pstHigh->data;pstHigh->data = iTmp;//从前往后换while ( pstLow != pstHigh && pstLow->data <= pivot ){pstLow = pstLow->pstNext;}//交换high lowiTmp = 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;
}


转载于:https://www.cnblogs.com/mtcnn/archive/2012/07/05/9410126.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate应用程序级可重复读取

介绍 在我以前的文章中&#xff0c;我描述了应用程序级事务如何为长时间的对话提供合适的并发控制机制。 所有实体都在Hibernate会话的上下文中加载&#xff0c;充当事务后写式缓存 。 Hibernate持久性上下文可以包含给定实体的一个引用和一个引用。 一级缓存可确保会话级可重…

HDU-2732 Leapin' Lizards 最大流

题目意思是有一些蜥蜴在一个迷宫里面&#xff0c;求这些蜥蜴还有多少是无论如何都逃不出来的。题目只给定一个行数&#xff0c;一个最远能够跳跃的距离&#xff0c;列数是不确定的&#xff08;题目告知列数小于等于20&#xff09;&#xff0c;但是数据一定会是一个矩阵。每只蜥…

canvas动画简单操作

canvas动画 小球滚动效果 关键api&#xff1a; window.requestAnimationFrame(draw) 会递归调用draw函数&#xff0c;替代setIntervalvar x 20; var speed 4; //电脑的帧率是1秒钟60Hz&#xff0c; 就相当于一秒钟可以播放60张图片&#xff0c;就相当于播放一张图片使用16.…

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…

node.js 搭建http调取 mysql数据库中的值

首先&#xff0c;我们先在数据库中创建两个表t_news,t_news_type;插入数据&#xff1a; 然后我们再写代码&#xff1a; //加载模块express var express require("express"); var fs require("fs"); //加载路径 var url require("url"); //加…

Spring Caching抽象和Google Guava Cache

Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。 我的目的是要介绍Spring现在为框架的4.0版本提供的较新的缓存实现之一-使用Google Guava Cache 简而言之&#xff0c;请考虑一种具有几种慢速方法的服务&#xff1a; public class DummyBoo…

NHibernate.3.0.Cookbook第三章第9节的翻译

Using stateless sessions 使用无状态会话 当进行大量数据处理的时候,可能会放弃使用一些高级特性,而使用更接近底层的API来提高性能.在NHibernate中,这种高性能的底层API就是无状态的会话.本节介绍如何使用无状态会话来更新movie对象的价格. 准备 使用第一章的Eg.Core和第二章…

致电以验证您的JavaFX UI的响应能力

最近&#xff0c;Jim Weaver在他的Surface Pro上为演示安装了我的小图片索引应用“ picmodo”&#xff0c;并且GUI变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&#xff1a; 我认为&#xff0c;即使调整大小行为和预期一样工作&#xff0c;UI也绝…