C# 数据结构--排序[下]

希尔排序(Shell Sort)

排序思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 dt=1(dt<dt-1…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

复杂度:O(n3/2)。

稳定性:不稳定。

代码实例:

int[] list = { 50, 10, 90, 30, 70, 40, 20 };
int len = list.Length;
int temp, j;
while (len > 1)
{len = len / 2;for (int i = len; i < list.Length; i++){if (list[i] < list[i - len]){temp = list[i];for (j = i - len; j >= 0 && temp < list[j]; j = j - len){list[j + len] = list[j];}list[j + len] = temp;}}
}
Console.WriteLine("希尔排序的结果:{0}",string.Join(",", list));

堆排序(Heap Sort )

排序思想:指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。

堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

复杂度:O(nlogn)。

稳定性:不稳定。

 

堆排序只用做以下二点:

1:从无序序列中构建起大顶堆。

2:交换大顶堆中顶节点和后结点(n)位置,重新调整剩余元素,构建一个新的大顶堆。依次循环....

代码实例:

static void Main(string[] args)
{int[] list = { 50, 10, 90, 30, 70, 40, 20 };for (int i = list.Length / 2 - 1; i >= 0; i--)       /* 构建大顶堆[list.Length / 2 - 1:无序数组中结点数]*/{HeapAdjust(list, i, list.Length);}int temp;for (int i = list.Length - 1; i > 0; i--)           /* 替换大顶堆的位置,然后重新构建大顶堆。*/{temp = list[0];                                 /* 替换大顶堆中最大值list[0]和最小值之前的位置list[i]*/list[0] = list[i];list[i] = temp;HeapAdjust(list, 0, i);                        /* 重新构建大顶堆*/}Console.WriteLine("堆排序的结果:{0}", string.Join(",", list));
}/// <summary>
/// 构建大顶堆
/// </summary>
/// <param name="list">排序集合</param>
/// <param name="NodeIndex">父结点</param>
/// <param name="len">大顶堆长度</param>
static void HeapAdjust(int[] list, int NodeIndex, int len)
{int temp = list[NodeIndex];                                          /*二叉树节点值*/for (int i = NodeIndex * 2 + 1; i < len; i = NodeIndex * 2 + 1)      /*循环二叉树节点下左右孩子[NodeIndex*2+1找到结点下的左右孩子]*/{if (i + 1 < len && list[i] < list[i + 1])                        /*i+1:是否存在左右两个孩子,list[i]<list[i+1]:默认左孩子大于右孩子*/{i++;                                                        /*左孩子小于右孩子直接i++ ,list[i]为右孩子值*/}if (temp >= list[i])                                            /*节点大于等于(左/右)孩子直接退出不替换节点值*/{break;}list[NodeIndex] = list[i];                                     /*替换节点和(左/右)孩子之间的值,保持结点大于左右孩子*/NodeIndex = i;                                                 /*重新设置结点值,循环查询*/}list[NodeIndex] = temp;                                            /*替换(左/右)孩子和结点之间的值*/
}

归并排序(Merge sort)

排序思想:“归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或两个以上的有序表组合成一个新的有序表。
归并排序(Merging Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌈n/2⌉(⌈x⌉表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

复杂度:O(nlogn) 。

稳定性:稳定。

代码实例:

static void Main(string[] args)
{int[] list = { 50, 10, 90, 30, 70, 40, 20 };MeSort(list, 0, list.Length - 1);Console.WriteLine("归并排序的结果:{0}", string.Join(",", list));
}static void MeSort(int[] list, int start, int end)
{if (start < end){int middle = (start + end) / 2;          /*对数组进行分组*/MeSort(list, start, middle);             /*分组左序列*/MeSort(list, middle + 1, end);           /*分组右序列*/MergeS(list, start, middle, end);        /*对左右序列进行合并(归并)*/}
}static void MergeS(int[] list, int first, int middle, int end)
{int IndexA = first;                                 /*左序列起始位置*/int IndexB = middle + 1;                            /*右序列起始位置*/int[] tempList = new int[end - first + 1];          /*左右序列合并后的临时数组*/int tempIndex = 0;while (IndexA <= middle && IndexB <= end)           /*循环左右序列中的数据*/{if (list[IndexA] >= list[IndexB])               /*对比左右序列中数据大小*/{tempList[tempIndex++] = list[IndexB++];     /*右元素大于左元素,把右元素存放到临时数组tempList中,并把临时数组tempIndex++,然后在取右序列中下一元素*/}else{tempList[tempIndex++] = list[IndexA++];     /*左元素大于右元素,把左元素存放到临时数组tempList中,并把临时数组tempIndex++,然后在取在序列中下一元素*/}}while (IndexA <= middle)                            /*有一侧子表遍历完后,跳出循环,将另外一侧子表剩下的数一次放入暂存数组中*/{tempList[tempIndex++] = list[IndexA++];}while (IndexB <= end){tempList[tempIndex++] = list[IndexB++];}tempIndex = 0;                                      /*设置临时数组从第1位开始替换*/for (int i = first; i <= end; i++)                  /*临时数组替换List数组中数据*/{list[i] = tempList[tempIndex++];}
}

快速排序(quick sort)

排序思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

复杂度:O(nlogn) 。

稳定性:不稳定。

 

代码实例:

static void Main(string[] args)                                                                   
{                                                                                         int[] list = { 50, 10, 90, 30, 70, 40, 20 };                                          QuickSort(list, 0, list.Length - 1);                                                  Console.WriteLine("快速排序的结果:{0}", string.Join(",", list));                      
}                                                                                         private static void QuickSort(int[] list, int start, int end)                             
{                                                                                         int pivot;                                                                            if (start < end)                                                                      {                                                                                     pivot = Partition(list, start, end);                /* 对序列一分为二数出中间值 */QuickSort(list, start, pivot - 1);                  /* 对低端序列进行排序 */      QuickSort(list, pivot + 1, end);                    /* 对高端序列进行排序 */      }                                                                                     
}                                                                                         private static int Partition(int[] list, int first, int end)                              
{                                                                                         int pivotkey = list[first];                         /* 默认取序列中第0位为枢轴 */     while (first < end)                                                                   {                                                                                     while (first < end && list[end] >= pivotkey)    /*比枢轴小的记录交换到低端*/      {                                                                                 end--;                                                                        }                                                                                 swap(list, first, end);                                                           while (first < end && list[first] <= pivotkey)  /*比枢轴大的记录交换到高端*/      {                                                                                 first++;                                                                      }                                                                                 swap(list, first, end);                                                           }                                                                                     return first;                                       /*返回枢轴值*/                    
}                                                                                         /// <summary>                                                                             
/// 替换数组A于B之间的位置                                                                
/// </summary>                                                                            
private static void swap(int[] list, int A, int B)                                        
{                                                                                         int temp = list[A];                                                                   list[A] = list[B];                                                                    list[B] = temp;                                                                       
}                                                                                         

 

常见排序方法基本就这些。已分享完毕.....

排序性能和速度快速排序优于其他常见排序方法。

 

转载于:https://www.cnblogs.com/caokai520/p/4359425.html

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

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

相关文章

奥林匹克数学竞赛教练员汇编,最牛奥数资料全集!

全世界只有3.14 % 的人关注了爆炸吧知识1985年&#xff0c;由北京大学、南开大学、复旦大学和中国科技大学四所大学倡议&#xff0c;中国数学会决定&#xff0c;自1986年起每年一月份&#xff08;第29届起改为每年12月举行&#xff09;举行全国中学生数学冬令营&#xff0c;后又…

成长 | 《大厂晋升指南》学习总结(中)

【学习总结】| Edison Zhou上一篇总结了晋升体系和职级详解&#xff0c;本篇总结面评技巧和学习方法。温馨提示&#xff1a;文中的贴图均来自极客时间《大厂晋升指南》课程。1面评技巧PPT框架华仔在多年的晋升答辩评委经历中总结了晋升答辩PPT的3个常见误区&#xff1a;&#x…

window.location.reload()会掉参数吗_iPhone手机电量不够用,你真的会用苹果吗?设置好这几个就OK了!...

用过iPhone的小伙伴都知道iPhone手机里的IOS系统&#xff0c;正是因为IOS系统独特的流畅度吸引了很多的用户成为了果粉。但是如今在中国市场上&#xff0c;iPhone手机在市场上占据的份额一年比一年低&#xff0c;近几年新兴崛起的国产手机华为、VIVO、小米以及年青人品牌的魅族…

Linux 下 MySQL 启动与关闭 说明

一.启动1.1 MySQL 进程可以用ps 命令查看进程&#xff1a;[rootrac2 ~]# ps -ef|grep mysqlroot 2161 1 0 09:38 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe--datadir/var/lib/mysql --pid-file/var/lib/mysql/rac2.pidmysql 2418 2161 0 09:38 ? …

历史上有哪些看似经PS处理实则没有的照片?

全世界只有3.14 % 的人关注了爆炸吧知识使用过xp系统的朋友&#xff0c;对这张图&#xff0c;肯定很是熟悉&#xff0c;毕竟是作为xp系统的经典桌面&#xff0c;名为Bliss。这张图是1996年在美国加利福尼亚州锁诺玛县&#xff0c;锁诺玛山谷南部靠近一家乳品公司旧址拍摄。摄影…

iNeuLink硬件网关与iNeuOS工业互联网操作系统互联互通应用案例

目 录1. 应用概述... 22. 模拟硬件设备配置... 23. iNeuLink硬件网关配置... 43.1 硬件介绍... 43.2 硬件网关配置... 44. iNeuOS工业互联网操作系统配置... 61. 应用概述有一个生产镍的矿业集团&#xff0c;要整合不同厂区的…

dubbo优势_Dubbo 迈出云原生重要一步 应用级服务发现解析

作者 | 刘军(陆龟) Apache Dubbo PMC概述社区版本 Dubbo 从 2.7.5 版本开始&#xff0c;新引入了一种基于实例(应用)粒度的服务发现机制&#xff0c;这是我们为 Dubbo 适配云原生基础设施的一步重要探索。版本发布到现在已有近半年时间&#xff0c;经过这段时间的探索与总结&a…

看了《隐秘的角落》才知道,掉头发有多可怕!10个掉头发最快的专业!快看看你中枪了没有!...

全世界只有3.14 % 的人关注了爆炸吧知识专业选得好秃头秃得早我爱学习&#xff0c;学习使我快乐我爱学习&#xff0c;学习使我进步我爱学习&#xff0c;学习使我美丽学习&#xff1a;我TM还能使你脱发呢我&#xff1a;港真现在上个大学不掉点头发都枉为一个真正的大学生上课与睡…

WPF企业内训全程实录(中)

摘要 WPF企业内训全程实录由于文章比较长&#xff0c;所以一共拆分成了三篇&#xff0c;上篇WPF企业内训全程实录&#xff08;上&#xff09;主 要讲了基础&#xff0c;这篇作为该实录的中篇&#xff0c;起着承上启下的作用,主要讲解开发模式、团队协作及应用框架。其实如果大家…

.Net Core with 微服务 - 可靠消息最终一致性分布式事务

前面我们讲了分布式事务的2PC、3PCTCC 的原理。这些事务其实都在尽力的模拟数据库的事务&#xff0c;我们可以简单的认为他们是一个同步行的事务。特别是 2PC,3PC 他们完全利用数据库的事务能力&#xff0c;在一阶段开始事务后不进提交会严重影响应用程序的并发性能。TCC 一阶段…

[ JS 进阶 ] Repaint 、Reflow 的基本认识和优化 (2)

你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *&#xff0c;CSS选择器层叠不能超过三层&#xff0c;CSS尽量使用类选择器&#xff0c;书写HTML少使用table&#xff0c;结构要尽量简单-DOM树要小....等这些忠告&#xff0c;以前我就大概知道使用通配符或者CSS选择器层次过…

vgh电压高了有什么_智能变频电源的功能是什么?

所谓的智能变频电源&#xff0c;其主要功能是将我国的城市电源(220V直流)转换为世界上其他国家的设备(110V&#xff0c;60Hz)&#xff0c;可以说&#xff0c;它的功能是一台很好的稳压器和调频设备。智能变频电源的功能是什么&#xff1f;著名的美国北宇实验室研究报告指出&…

PDC Party 即将在东莞登场

各位社区精英们&#xff0c; 我们即将在东莞举办PDC Party的活动&#xff0c;本次活动除了精彩的PDC Keynote Demo视频分享与微软技术趋势的讨论之外&#xff0c;还希望能够借此机会&#xff0c;与各位微软技术社区精英们面对面的交流&#xff0c;共同讨论后续的发展&#xff0…

你们数学老师当年是怎么叫这些符号的…

全世界只有3.14 % 的人关注了爆炸吧知识你们数学老师都是怎么叫这些符号的呢&#xff1f;

自主生态再进一步,龙芯中科完成.NET3.1-LoongArch64平台研发

近日&#xff0c;龙芯中科.NET团队完成了.NET3.1-LoongArch64平台研发工作&#xff0c;研发的成功标志着围绕龙芯自主指令系统LoongArch的生态建设成果再进一步。龙芯自主指令系统LoongArch基于龙芯二十年的CPU研制和生态建设积累&#xff0c;LoongArch从顶层架构&#xff0c;到…

keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...

全文共3376字&#xff0c;预计学习时长7分钟对许多科学家、工程师和开发人员而言&#xff0c;TensorFlow是他们的第一个深度学习框架。TensorFlow 1.0于2017年2月发布&#xff1b;但客观来说&#xff0c;它对用户不是非常友好。过去几年里&#xff0c;由于Keras和PyTorch比Tens…

KlayGE 4.0中Deferred Rendering的改进(五)完结篇:Post process

转载请注明出处为KlayGE游戏引擎上一篇分析了KlayGE中实现实时全动态GI的方法&#xff0c;本篇是这个系列的完结篇&#xff0c;主要讲流水线的最后一段&#xff1a;Post process。 Post process 在KlayGE 4.0的Deferred Rendering中&#xff0c;post process主要有HDR、AA和col…

Centos 手工创建新用户

当我们要创建一个用户时&#xff0c;通常使用useradd命令就可以自动创建了一个用户&#xff1b;实际上&#xff0c;在linux下&#xff0c;一切皆文件&#xff0c;设置好几个文件&#xff0c;也是可以创建出一个用户&#xff1a;文件如下&#xff1a;/etc/passwd :用户/etc/sha…

为了这个羞羞的项目,我差点成为“鉴黄师”

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;大数据文摘编译&#xff1a;蒋宝尚、魏子敏给男同学们一个机器学习&#xff0c;他们能研究所有他们能想到的问题。当然&#xff0c;根据这本真实存在的畅销书&#xff0c;他们真的能想到的话题也不多????开个玩笑&am…

【.NET】实现CI/CD(二)运行镜像,自动化部署

&#xff08;一重山&#xff0c;两重山。&#xff09;书接上文&#xff0c;在上回中我们说到了《【Azure Core】实现CI/CD&#xff08;一&#xff09;构建镜像并推送仓库今天我们继续往下说&#xff0c;说下CD&#xff08;持续部署&#xff09;的流程&#xff0c;也是很简单。…