基本思想:通过一趟排序将待排记录分割成独立两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,

则可分别对这两部分继续进行排序,重复操作以上操作,已达到整个序列有序的目的

void QuickSort(SqList *L){QSort(L,1,L->length);}

/* 对顺序表L中的子序列L->dara[low..high]最快速排序 */void QSort(SqList *L,int low,int high) { int pivot; if(low<high){ pivot = Partition(L,low,high); /*将L->data[low..high]一分为二,并算出分界点 */ QSort(L,low,pivot-1); /* 分界点左边进行排序 */ QSort(L,pivot+1,high); /* 分界点右边进行排序 */ } }

/*
交换L中子表的记录,使枢轴记录到位,并返回其所在的位置
此时,它之前(后)的记录均不大(小)于它
*/int Partition(SqList *L,int low,int high) { int pivotkey; pivotkey = L->r[low]; while(low<high){ while(low<high && L->r[high]>=pivotkey) high --; swap(L,low,high); while(low<high && L->r[low]<=pivotkey) low++; swap(L,low,high); } return low; }

改进算法:

1、优化选取枢轴

三数取中法,即先选取三个关键字进行排序,将中间数作为枢轴,一般取左端、中间、右端三个数。

/*
交换L中子表的记录,使枢轴记录到位,并返回其所在的位置
此时,它之前(后)的记录均不大(小)于它
*/int Partition(SqList *L,int low,int high){int pivotkey;int m = low +(high-low)/2;            /* 计算数组中间元素的下标 */if(L->data[low]>L->data[high])      /* 交换左右保证左边的较小 */swap(L,low,high);if(L->data[m]>L->data[high])      /* 交换中间 和右边保证中间的较小 */swap(L,m,high);if(L->data[low]>L->data[m])      /* 交换中间 和左边保证左边的较小 */swap(L,m,low);pivotkey = L->data[m];                   /* 用子表的中间值作为枢轴 */L->data[0] = pivotkey;                     /* 将轴关键字备份到L->data[0] */while(low<high){while(low<high && L->data[high]>=pivotkey)high --;L->data[low] = L->data[high];        /* 采用替换 而不采用交换 */while(low<high && L->data[low]<=pivotkey)low++;L->data[high] = L->data[low];         /* 采用替换 而不采用交换 */}L->data[low] = L->data[0];                /* 将枢轴数值替换回L->data[low] */return low;}

 

优化不必要的交换

转载于:https://www.cnblogs.com/huixuexidezhu/p/5969200.html

数据结构学习(十三)、快速排序相关推荐

  1. C1认证学习十三(数据结构常识)

    C1认证学习十三(数据结构常识) 任务背景 数据结构是计算机中存储.组织数据的方式,他研究如何构造复杂的软件系统,它的核心是如何分解以及抽象,并且得到软件开发过程中的所需要的逻辑结构. 任务目标 1. ...

  2. 数据结构学习笔记之快速排序(非递归)

    数据结构学习笔记之快速排序(非递归) 代码如下: #include<assert.h> #include<memory.h> //快速排序(升序) void QuickSort ...

  3. 算法设计和数据结构学习_2(常见排序算法思想)

    一般约定我们是按照从小到大的顺序排序. 按照向量的形式来参考排序中数组元素的相对位置,行向量中最左边为数组的第一个元素,且称为前面.列向量中最上面的元素为数组的第一个元素,也是称为前边. 对常见的排序 ...

  4. 数据结构学习笔记(王道)

    数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...

  5. 数据结构学习系列文章合集

    数据结构学习系列文章目录 前言 1.稀疏数组和队列 稀疏数组和二位数组的转换 数组队列的实现 环形队列的介绍与实现 2.链表 单链表的增.删.改.查 总结 前言 学习数据结构记录,作为自己的笔记,同时 ...

  6. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...

    ## 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源) ## 视音频编辑器 ## 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处 ...

  7. 【杂谈】野生在左 科班在右——数据结构学习誓师贴

    [杂谈]野生在左 科班在右--数据结构学习誓师贴 一. 科班 Vs 野生 这个老生常谈的问题让很多野生码农觉得不公平,在一次次面试中因为学历和那些工作中根本就用不到的知识虐的一脸懵逼,然后除了抱怨什么 ...

  8. C语言数据结构学习用单元测试

    药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...

  9. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...

最新文章

  1. 数学工具WZgrapher
  2. 求方程ax2+bx+c的根python_Python,计算 ax^2 + bx + c = 0的根
  3. 裸设备 linux,Linux平台下裸设备的绑定:
  4. Android Support 包里到底有什么
  5. C++decltype关键字
  6. 415. Add Strings 字符串相加
  7. [VC]strcpy memcpy memset区别与简介
  8. 【STM32 .Net MF开发板学习-09】AD模拟量采集
  9. 计算机sci论文怎么写,计算机学院陈端兵教授分享SCI论文写作方法
  10. ActiveMQ学习三-持久化订阅
  11. mysql源码分析——THD数据结构
  12. 谷粒学院(十九)统计分析模块 | 定时任务 | echarts
  13. 新版openwrt配置vlan 拨号-局域网-iptv
  14. 学委参加博客之星评选啦
  15. Unity虚拟现实插件VRTK3.3使用教程一:基本配置
  16. 分布式数字身份 —— 从创建一个Weidentity数字身份开始
  17. oracle数据库 cmd,cmd命令操作Oracle数据库
  18. oracle进入asm命令,Oracle常用ASM操作命令
  19. Ripple(瑞波)之交易清算
  20. 嘀嗒出行IPO 会成为出行界的“拼多多”吗

热门文章

  1. 初试linux编译(ubuntu+vim)+玩转智能蛇
  2. 2022-2028年中国BOPET薄膜行业市场全景调查及投资前景预测报告
  3. 利用cre2进行分组模式匹配的实例
  4. SpringBoot (六) :SpringBoot定时器实现(简单入门)
  5. 命名实体识别学习笔记——使用Ltp
  6. ImportError: DLL load failed: 找不到指定的模块。 TensorFlow 1.13
  7. 服务器技术综述(二)
  8. ADAS摄像头图像环视拼接算法
  9. Mysql悲观锁以及乐观锁案例说明
  10. Unterminated array at character 6 of xxx