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;后又…

centos7 禁止ip访问_centos7.6版本限制某个IP访问指定端口

centos7 更新安全补丁:yum update -y centos7 firewall防火墙很好用,最近总被黑客入侵服务器系统,搞的很不耐烦,通过大佬的指点,知道怎么限制IP和端口了,先感谢DS大佬。 我这安装的是centos7.6,默认安装完成之后服务器的防火墙没有运行。 查看防火墙状态: firewall-cmd…

兔子野鸡49只100条腿c语言,家禽生产学复习题

家禽生产学复习资料(07年-12年试题及其答案)一、名词解释(每题2.5分&#xff0c;共25分)1、胚盘:受精后的蛋&#xff0c;生殖细胞在输卵管过程中&#xff0c;经过分裂&#xff0c;形成中央透明、周围暗的盘状形原肠胚。2、气囊:是装有空气的膜质囊&#xff0c;一端与气管相连&a…

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

【学习总结】| 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 ? …

四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x

四种DCOM错误的区别Differences between the following DCOM error0x800800050x800706be0x800101050x800706ba0x80080005:CO_E_Server_Exec_FailureServer execution failedIt is usually quite clear: COM (really, RPCSS) tried to launch a particular server process and e…

巴比伦算法求平方根c语言,巴比伦算法求平方根

算法描述&#xff1a;这种方法比较就远了&#xff0c;也可以从牛顿迭代法推导。假设x^2n &#xff0c;给出n 要求x 的值。1 从一个任意的值x开始(越靠近根越好)。2 初始化y 1.3. 重复一下步骤直到求得近似值&#xff1a;a) 取x和y的平均数为下一个近似的根b) y n/x不管刚开始…

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

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

爱思助手短信备份到安卓_爱思助手肿么将短信导入iphone

第一步&#xff1a;将你的IPHONE越狱&#xff0c;否则无法连接《91手机助手》&#xff1b;至于如何越狱&#xff0c;俺就不教了(因为俺也不会&#xff0c;找卖手机的朋友搞定吧)&#xff1b;第二步&#xff0c;将你的安卓手机连接《豌豆荚》&#xff0c;在“短信”里&#xff0…

话里话外:企业内控的灵魂——企业文化

许多企业在谈到企业内控的时候&#xff0c;往往想到的更多的是如何建立更加完善严格的企业内控制度来约束员工、领导的行为&#xff0c;如何通过组织结构的调整保障企业内控的执行等等&#xff0c;但这些只是为了实现企业内控所采取的“硬约束”&#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…

编码之道:取个好名字很重要

11 February 2015代码就是程序员的孩子&#xff0c;给“孩子”取个好听的名字很重要&#xff01; 我们在项目开发中&#xff0c;接触到的变量、函数、类多数都是项目自己定义的&#xff0c;往往都是为了解决一些特定的领域的问题&#xff0c;引入了各种各样的概念&#xff0c;代…

link的属性media的用处

<link rel”stylesheet” type”text/css” media”print” href”main.css” /> 就是样式输出的设备。 默认为 screen (缺省值)&#xff0c;提交到计算机屏幕&#xff1b;print&#xff0c; 输出到打印机&#xff1b;projection&#xff0c;提交到投影机&#xff1b;aur…

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

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

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

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

dakai微信小程序 ios_iOSAPP跳转微信小程序

前言APP跳转微信小程序&#xff0c;首先先关注一下微信官方给的一些资料&#xff1a;移动应用拉起小程序功能、iOS开发示例、iOS资源下载。准备工作准备工作需要在微信公众平台注册开发一个小程序、在微信开放平台注册申请一个APP&#xff0c;审核通过后方可使用&#xff0c;AP…

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

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

软件开发技术

1. 你们的项目组使用源代码管理工具了么&#xff1f;应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。 2. 你们的项目组使用缺陷管理系统了么&#xff1f;应该用。ClearQuest太复杂&#xff0c;我的推荐是BugZilla。 3. 你们的测试组还在用Wor…