当前位置: 首页 > news >正文

java nodelist 快速排序_数据结构的实践心得(归并排序和快速排序:mergeSort、quickSort)...

数据结构的实践心得(归并排序和快速排序:mergeSort、quickSort)

COMZHJ 咕咚的小宇宙

fe00e6a3e1249be2be0b7ebbe7b56823.png

0b667b5665641c80f1618ed7abd8e119.png

归并排序和快速排序(mergeSort、quickSort):

// 归并排序

void mergeSort(linkQueue *que);

// 快速排序

void quickSort(linkQueue *que);

// 合并两个有序序列

int merge(doubleNode **mergeList, int start, int mid, int end)

{

int count = 0;

// 创建临时内存空间存储合并后结果

doubleNode **list = (doubleNode **)malloc(sizeof(doubleNode *) * (end - start + 1));

int left = start, right = mid + 1, index = 0;

// 两个有序序列中元素的比较合并

while ((left <= mid) || (right <= end))

{

count++;

// 逐个比较两个序列节点的优先级

if (left > mid)

{

list[index++] = mergeList[right++];

}

else if (right > end)

{

list[index++] = mergeList[left++];

}

else if (mergeList[left]->data[PriorityINDEX] > mergeList[right]->data[PriorityINDEX])

{

list[index++] = mergeList[right++];

}

else

{

list[index++] = mergeList[left++];

}

}

int i;

// 将合并结果写回原来的数组

for (i = 0; i < index; i++)

{

count++;

mergeList[start + i] = list[i];

}

// 释放临时内存空间

free(list);

return count;

}

// 归并排序(指针数组)

int mergePointArray(doubleNode **mergeList, int start, int end)

{

int count = 0;

// 只有一个元素,视作有序,结束分割

if (end <= start) return count;

// 取得中间数

int mid = (end + start) / 2;

// 递归分割第一个序列

count += mergePointArray(mergeList, start, mid);

// 递归分割第二个序列

count += mergePointArray(mergeList, mid + 1, end);

// 合并两个有序序列

count += merge(mergeList, start, mid, end);

return count;

}

// 归并排序

void mergeSort(linkQueue *que)

{

// 取得优先队列的链表数据长度

int len = que->doubleLink.len;

if (len <= 1) return;

doubleNode **mergeList = (doubleNode **)malloc(sizeof(doubleNode *) * len);

// 定义一个指针,首先指向头节点

doubleNode *p = que->doubleLink.head;

int asdf = 0;

int i;

// 把优先队列的数据,装入指针数组

for (i = 0; i < len; i++)

{

asdf++;

mergeList[i] = p;

p = p->next;

}

// 归并排序(指针数组)

asdf += mergePointArray(mergeList, 0, len - 1);

// 首先指向尾节点

p = mergeList[len - 1];

// 把优先队列的数据,装入指针数组

for (i = 0; i < len; i++)

{

asdf++;

// 更新前后节点关系

p->next = mergeList[i];

mergeList[i]->prev = p;

p = mergeList[i];

}

printf("归并排序算法复杂度=%d\n", asdf);

// 更新头节点

que->doubleLink.head = mergeList[0];

// 释放指针数组的内存空间

free(mergeList);

// 更新队前和队尾节点

que->front = que->doubleLink.head;

que->rear = que->doubleLink.head->prev;

}

// 快速排序(指针数组)

int quickPointArray(doubleNode **mergeList, int start, int end)

{

int count = 0;

// 序列中没有元素或只有一个元素,递归结束

if (end <= start) return count;

int left = start, right = end, hole = start;

doubleNode *temp = mergeList[start];

while (left < right)

{

count++;

// 从right位置开始从后往前找第一个小于temp的值

while ((left < right) && (temp->data[PriorityINDEX] <= mergeList[right]->data[PriorityINDEX]))

{

right--;

}

if (left == right) break;

mergeList[hole] = mergeList[right];

hole = right;

count++;

// 从left位置开始从前往后找第一个大于temp的值

while ((left < right) && (temp->data[PriorityINDEX] >= mergeList[left]->data[PriorityINDEX]))

{

left++;

}

if (left == right) break;

mergeList[hole] = mergeList[left];

hole = left;

}

mergeList[hole] = temp;

// 对标杆位置左边的序列实施同样的方法

count += quickPointArray(mergeList, start, hole - 1);

// 对标杆位置右边的序列实施同样的方法

count += quickPointArray(mergeList, hole + 1, end);

return count;

}

// 快速排序

void quickSort(linkQueue *que)

{

// 取得优先队列的链表数据长度

int len = que->doubleLink.len;

if (len <= 1) return;

doubleNode **mergeList = (doubleNode **)malloc(sizeof(doubleNode *) * len);

// 定义一个指针,首先指向头节点

doubleNode *p = que->doubleLink.head;

int asdf = 0;

int i;

// 把优先队列的数据,装入指针数组

for (i = 0; i < len; i++)

{

asdf++;

mergeList[i] = p;

p = p->next;

}

// 进行快速排序

asdf += quickPointArray(mergeList, 0, len - 1);

// 首先指向尾节点

p = mergeList[len - 1];

// 把优先队列的数据,装入指针数组

for (i = 0; i < len; i++)

{

asdf++;

p->next = mergeList[i];

mergeList[i]->prev = p;

p = mergeList[i];

}

printf("快速排序算法复杂度=%d\n", asdf);

// 更新头节点

que->doubleLink.head = mergeList[0];

// 释放指针数组的内存空间

free(mergeList);

// 更新队前和队尾节点

que->front = que->doubleLink.head;

que->rear = que->doubleLink.head->prev;

}

相关文章:

  • java xml setdoctype_集合Set映射一对多(使用xml文件)
  • java dofinalize_Java finalize方法使用
  • java调用ecdh_Jecc(java椭圆曲线加密库)学习笔记及ECDH实现
  • java雷达_Java编写有关雷达问题,哪位高手帮个忙,谢谢~~~
  • 继承java_Java— 继承
  • java guid_细说Java生成GUID的实现方法
  • java多租户_(九十二)java版spring cloud 多租户社交电子商务-gateway(实现限流)...
  • foxpro mysql_Foxpro数据库命令汇总
  • java generatedvalue_java – 在JPA @GeneratedValue列中手动指定主键的值
  • java io byte_JavaIO之字节流学习笔记
  • 八大排序方法java_八大排序java
  • java一个类怎么调用另一个类的变量_如何在一个类里调用到另一个类的变量的值...
  • java return后执行_java 问题 如果前一个return执行了 那么后面的一系列System.out.println 还会执行吗...
  • java持久层_java访问持久层技术的进化
  • java set encoding file_系统变量file.encoding对Java的运行影响有多大?(转)good
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【comparator, comparable】小总结
  • 【面试系列】之二:关于js原型
  • 2017-08-04 前端日报
  • js正则,这点儿就够用了
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Theano - 导数
  • windows-nginx-https-本地配置
  • Yeoman_Bower_Grunt
  • 官方解决所有 npm 全局安装权限问题
  • 深入浅出Node.js
  • 我看到的前端
  • 智能网联汽车信息安全
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • #include到底该写在哪
  • #Z0458. 树的中心2
  • (C#)一个最简单的链表类
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Python) SOAP Web Service (HTTP POST)
  • (独孤九剑)--文件系统
  • (九十四)函数和二维数组
  • (强烈推荐)移动端音视频从零到上手(下)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一) springboot详细介绍
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)我也是一只IT小小鸟
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 中创建支持集合初始化器的类型
  • .sys文件乱码_python vscode输出乱码
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [C#] 如何调用Python脚本程序
  • [codevs 1296] 营业额统计
  • [ISITDTU 2019]EasyPHP
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [NAND Flash 6.1] 怎么看时序图 | 从时序理解嵌入式 NAND Read 源码实现
  • [Oh My C++ Diary]怎样用cmd运行exe控制台程序