【C】双边循环快速排序,升序和降序的区别
框架
数组内有很多0元素,通常没有问题,但是我项目中出现要排序的是保存结构体指针的链表元素,其中可能有空元素,明明有节点,但是没有数据的情况。
这种情况有时应该放开头,有时放结尾,有时直接删除掉(也许是排序后)。
说了这么多,也不是这篇所写的内容
#include <stdio.h>//升序
void qsort(size_t* _arr, size_t _low, size_t _high) ;//降序
void qsort2(size_t* _arr, size_t _low, size_t _high) ;void show(size_t* _arr, size_t _len) {printf("arr:\n");for (size_t i = 0; i < 20; ++i)printf("%4d", i);printf("\n");for (size_t i = 0; i < 20; ++i)printf("%4d", _arr[i]);printf("\n");
}int main(void) {size_t arr[20] = { 12,34,23,212,45,1,2,0,18,12,3 }; show(arr, 20);qsort(arr, 0, 20 - 1);show(arr, 20);return 0;
}
升序
void qsort(size_t* _arr, size_t _low, size_t _high) {if (_low >= _high) return;size_t l = _low;size_t h = _high;size_t key = _arr[_low];size_t t;while (l != h) {//在右边找小于等于key的元素while (l < h && _arr[h] > key) --h;//在左边找大于key的元素while (l < h && _arr[l] <= key) ++l;//交换左右找到的两个元素if (l < h) {t = _arr[l];_arr[l] = _arr[h];_arr[h] = t;}}//循环中出来后l和h重合了,所以第一个元素交换到中间去_arr[_low] = _arr[l];_arr[l] = key;//以第一个元素为分界线qsort(_arr, _low, l - 1);qsort(_arr, l + 1, _high);
}
效果
arr:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1912 34 23 212 45 1 2 0 18 12 3 0 0 0 0 0 0 0 0 0
arr:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 190 0 0 0 0 0 0 0 0 0 1 2 3 12 12 18 23 34 45 212
降序
void qsort2(size_t* _arr, size_t _low, size_t _high) {if (_low >= _high) return;size_t l = _low;size_t h = _high;size_t key = _arr[_high];size_t t;while (l != h) {//在左边找小于等于key的元素while (l < h && _arr[l] > key) ++l;//在右边找大于key的元素while (l < h && _arr[h] <= key) --h; //交换左右找到的两个元素if (l < h) {t = _arr[l];_arr[l] = _arr[h];_arr[h] = t;}}//循环中出来后l和h重合了,所以最后一个元素交换到中间去_arr[_high] = _arr[h];_arr[h] = key;//以最后一个元素为分界线qsort2(_arr, _low, h - 1);qsort2(_arr, h + 1, _high);
}
效果
arr:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1912 34 23 212 45 1 2 0 18 12 3 0 0 0 0 0 0 0 0 0
arr:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19212 45 34 23 18 12 12 3 2 1 0 0 0 0 0 0 0 0 0 0
升序降序的区别
- 左右找的基准元素不同,升序找第一个,降序找最后一个(PS:有时是随机找的)
- 左右找的元素大小不同,升序时左边找大于基准的,右边找小于基准的。降序时左边找小于基准的,右边找大于基准的
- 左右开始扫描的顺序不同,升序时右边指针先开始,降序时左边指针先开始
【C】双边循环快速排序,升序和降序的区别相关推荐
- java comparator 降序排序_【转】java comparator 升序、降序、倒序从源码角度理解
原文链接:https://blog.csdn.net/u013066244/article/details/78997869 环境 jdk:1.7+ 前言 之前我写过关于comparator的理解,但 ...
- mysql同时满足升序和降序_MySQL性能优化(三):索引
点击上方蓝色"码农架构",选择"设为星标" 专注于高可用.高性能.高并发类技术分享! 索引原理 如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开 ...
- java list逆序_Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用...
list升序,降序,逆序 Listlist =new ArrayList(); //如果list是 5 7 2 6 8 1 4 1.升序: Collections.sort(list) //list: ...
- js数组去重排序(升序、降序、随机)方法
js原生去重排序 var hhl = [1, 5, 6, 3, 2, 7, 6, 1, 5, 4, 8, 6, 9]var newArr = [];//创建一个新数组var isRepeat = fa ...
- 【Java】用sort实现对数组的升序和降序排序
Java 用 sort 实现对数组的升序和降序排序 一.ArrayList 的升序与降序 二.数组升序 三.数组降序 方法一 方法二 一.ArrayList 的升序与降序 升序:Collections ...
- java中升序 降序怎么表示_Java sort()数组排序(升序和降序)
我们在学习 Java 的过程中肯定会遇到对数组进行升序或降序等排序问题,本节主要介绍如何实现 Java 数组的升序和降序.Java 语言使用 Arrays 类提供的 sort() 方法来对数组进行排序 ...
- WinForm绘制带有升序、降序的柱形图
WinForm绘制带有升序.降序的柱形图 private void HuiZhiTu( string strPaiXu){//初始数据int[] nums = { 150, 89, 200, 60, ...
- 输入整型数组和排序标识,对其元素按照升序或降序进行排序(华为OJ系列)
输入整型数组和排序标识,对其元素按照升序或降序进行排序接口说明原型:void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag);输入参数 ...
- c#sort升序还是降序_被玩坏的数组排序之sort函数
JavaScript 的数组排序是一个非常常见业务场景 ECMAScript 为数组提供了一个原生的sort函数,今天我们就来好好看看你对sort函数究竟了解多少. 首先我们来看一下sort函数的基本 ...
最新文章
- android 拼图课程设计,Flash拼图游戏制作课程设计报告
- java多层catch语句_Java异常之catch语句块
- DateTime时间格式转换为Unix时间戳格式
- C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)
- 今年的hsctf里遇到了一个比较少见的nds逆向题目,侥幸拿下一血
- 02 | 日志系统:一条SQL更新语句是如何执行的? 笔记(转)
- AC自动机 HDOJ 2222 Keywords Search
- 【ZZ】ubuntu9.10桌面版使用(一)基础安装配置
- envi安装成功教程 附下载地址
- Python2笨方法学习Python--习题二:注释和井号
- 移动通信原理中信道的分类
- html5方框的箭头怎么弄,纯CSS-带箭头的DIV方框
- DDI(DNS、DHCP和IPAM)解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Java学习06–前端基础之HTML
- 【C语言】动态申请空间
- PHP税前税后,请问下大家 怎么根据税后工资1万元推算出税前工资是多少
- 十分钟带你做一个学生管理系统
- 玩转群晖NAS套件系列五:Moments的安装与使用保姆级教程!
- Maven学习笔记,动力节点maven教程随堂笔记(史上最全)
- 小程序生成图片保存到系统相册_电子相册怎么做 快速制作电子相册方法
热门文章
- ActiveMQ——基于Zookeeper搭建Replicated LevelDB集群
- docker(11、Docker Swarm4)11、副本数量(replicated 和 global )12、Label 控制 Service 的位置 13、如何配置 Health Check
- Terracotta简单使用
- 城市污泥类毕业论文文献有哪些?
- “我爱淘”冲刺阶段Scrum站立会议2
- 缺少linux内核,Linux内核态缺页会发生什么?一文玩转Exception fixup表
- 联想LePad平板电脑不久上市
- 【java】【贪心算法】换零钱问题
- 逻辑与和按位与、逻辑或和按位或的区别
- Editor HDU 4699