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
C# 数据结构--排序[下]相关推荐
- 数据结构-排序算法总结与感悟
数据结构-排序算法总结 一,排序的基本概念 排序:有n个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2, -,Kn },相应的下标序列为1,2,-, n.通过排序,要求找出当前下 ...
- C++基础-介绍·数据结构·排序·算法
C++基础-介绍·数据结构·排序·算法 特点 使用方向 RPC Data Struct 数据结构 栈 Stack 内存分配中的栈 队列 List 数组 Array 链表 LinkTable 树 Tre ...
- 数据结构-排序算法(c语言实现篇)
数据结构-排序算法(c语言实现篇) 排序算法是非常常用的算法,从介绍排序的基本概念,到介绍各种排序算法的思想.实现方式以及效率分析.最后比较各种算法的优劣性和稳定性. 1 排序的概念及应用 1.1 排 ...
- 小孩的游戏 - 2021数据结构 排序和选择实验题
小孩的游戏 - 2021数据结构 排序和选择实验题 pre 做都做了, 干脆发上来算了 : D 题目分析 算法与数据结构实验题 5.18 小孩的游戏 ★实验任务 一群小孩子在玩游戏,游戏规则是这样子, ...
- 数据结构---排序算法的总结
数据结构-排序算法的总结 分类 冒泡排序,时间复杂度O(n x n),空间复杂度O(1),稳定 简单选择排序,时间复杂度O(n x n),空间复杂度O(1),不稳定 希尔排序,时间复杂度O(n^1.3 ...
- 数据结构-排序基础代码
数据结构-排序基础代码 1.快排的递归算法: void QuickSort(int A[],int n){Qsort(A,0,n-1); } void Qsort(int A[],int left,i ...
- 数据结构----排序
##数据结构--排序 Created with Raphaël 2.1.2选择选择直接选择直接选择堆排序堆排序直接选择堆排序大根堆.小根堆:找出最小(大)的Key Created with Rapha ...
- 【数据结构排序算法系列】数据结构八大排序算法
排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...
- 排序(下)---快排、归并
排序(下)-快排.归并 快速排序 采用分治的思想:每次选区一个数作为基准,让整个数据中凡是大于此数的放在此数的右边,小于此数的放在此数的左边,然后进行对此数的两边进行选基准,如上方式的分法,递归下去, ...
最新文章
- linux redis ruby,redisrequiresrubyversion2.2.2的解决方案
- 集结最优秀同行,智源面向全球诚邀研究人才加入
- 信息安全意识电子期刊第八期
- ChipScope Pro内核生成器应用实例
- nodejs-EventEmitter
- js 定时网页点击_JS的小乐趣:轻松完成打地鼠游戏
- 解决ubuntu无法修改分辨率为1920*1080问题
- k8s StatefulSet
- 常用UI模板,loading框,提醒框,弹框确认框
- 设计模式3—行为型模式
- python server酱_12306这是肿么了?开售一秒就抢完,如何用Python抢到回家车票?
- 遇到一个因socket未关闭引发的文件句柄用完问题
- Android 获取手机号及运营商信息
- 【数据可视化应用】IDW插值计算实战案例(附Python和R语言代码)
- 项目管理工具之甘特图
- jQuery使用ajaxSubmit()提交表单示例
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》
- iOS App Extension 介绍
- 微信公众号开发API
- 飞凌嵌入式RK3399-C开发板常见问题及解决方案分享