shell排序

C++实现排序算法之希尔排序

一世执手 提交于 2020-03-05 15:36:24
C++实现排序算法之希尔排序: 时间复杂度:O(n^1.5); 算法稳定性:不稳定的排序算法; 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt < dt-1 <… < d2 < d1),即所有记录放在同一组中进行直接插入排序为止。 该方法实质上是一种分组插入方法 比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时

spark: 二次排序-2

北战南征 提交于 2020-03-02 12:39:51
在上一篇文章,使用了###错误###的方法实现二次排序,导致排序按key字典排序,并非我们想要的结果 现在,使用自定义排序方法来实现二次排序 1, 思路 输入数据 aa 12 bb 32 aa 3, cc 43 dd 23 cc 5 cc 8 bb 23 bb 12 自定义排序类:对二元组(key:String, value:Int)进行排序 把每一行数据map成二元组(key:String, value:Int) 排序 -- scala自动使用步骤1定义的排序类进行排序 /** * 1. 自定义排序类:对二元组(key:String, value:Int)进行排序 */ class KVOrdering extends Ordering[Tuple2[String, Int]] with Serializable { override def compare(x: Tuple2[String, Int], y: Tuple2[String, Int]):Int = { val comp = x._1.compareTo(y._1) if (comp == 0) { // key相等, 则比较value x._2.compareTo(y._2) } else { comp } } } 由于scala的隐式转换机制,这个类会对闭包内的所有Tuple2[String, Int]产生作用

Shell中的常用命令

大憨熊 提交于 2020-02-14 20:36:07
1. cut命令 通常用来截取 -d 指定分隔符 -c 指定截取的字符的位置 -f 指定要截取的列 2. sort-uniq命令 对首列进行排序 对数字排序 -o指定输出文件 去重排序 去重反向排序 排序再显示重复数字次数 排序再显示重复行 排序再显示不重复行 -k指定列 -t指定分隔符 来源: CSDN 作者: Outside! 链接: https://blog.csdn.net/qq_45594312/article/details/104315146

Java实现各种排序算法

爱⌒轻易说出口 提交于 2020-02-07 01:31:17
文章目录 1 排序算法分类 2 算法实现 2.1 冒泡排序 2.2 选择排序 2.3 插入排序 2.4 希尔排序(shell排序/缩小增量排序) 2.5 快速排序 2.6 堆排序 2.7 合(归)并排序 3 算法执行效率 1 排序算法分类 2 算法实现 2.1 冒泡排序 public class BubbleSortDemo { static final int SIZE = 30 ; public static void bubbleSort ( int [ ] array ) { int temp ; for ( int i = 1 ; i < array . length ; i ++ ) { for ( int j = 0 ; j < array . length - i ; j ++ ) { // 将数组升序排序 if ( array [ j ] > array [ j + 1 ] ) { temp = array [ j ] ; array [ j ] = array [ j + 1 ] ; array [ j + 1 ] = temp ; } } } } public static void main ( String [ ] args ) { int [ ] array = new int [ SIZE ] ; System . out . println (

排序算法-希尔排序(Shell Sort)

自作多情 提交于 2020-01-29 16:37:12
文章目录 希尔排序法介绍 希尔排序法算法 时间复杂度 稳定性 其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是 D.L.Shell 于1959年提出的一种排序算法,是 直接插入排序法 的更高效的改进版。在这之前的排序算法如 冒泡排序 、 简单选择排序 、 直接插入排序 等算法的的时间复杂度都为 O ( n 2 ) O(n^{2}) O ( n 2 ) ,而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并且记录数相对较少的情况,只需要简单的几个插入动作就能完成排序。 希尔排序的思路就是在插入排序算法的基础上,创造插入排序算法的有利条件,将序列按照某个增量分成多个子序列进行插入排序,使整个序列变为基本有序,并且由于按照增量分了子序列,所以每个子序列的记录数变少了,增量和子序列长度成反比,增量从小于n的某个值每次递减,子序列随增量变小而变长。直到增量变为1,使其所有记录为一个整体序列然后进行一次插入排序为止。 什么才叫基本有序呢?比如{2,1,4,3,5,6,8,7,9}可以说是基本有序,小的数字基本在序列的前部,不大不小的在中部,大的数字在后部。 {8,7,6,3,9,2,4,5,1}这样的序列就不是基本有序,因为1在序列的最后,9在中间,8在第一位,所以谈不上是基本有序的。 【例子】

shell命令--sort

此生再无相见时 提交于 2020-01-22 18:12:14
shell命令--sort 0、sort命令的专属图床 点此快速打开文章 【 图床_shell命令sort 】 1、sort命令的功能说明 ​ sort 命令用于将文本文件内容加以排序。 sort 可针对文本文件的内容,以行为单位来排序。 2、sort命令的语法格式 SYNOPSIS sort [OPTION]... [FILE]... sort [OPTION]... --files0-from=F 3、sort命令的选项说明 -b: 忽略每行前面开始出的空格字符。 -c: 检查文件是否已经按照顺序排序。 -d: 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。 -f: 排序时,将小写字母视为大写字母。 -i: 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。 -m: 将几个排序好的文件进行合并。 -M: 将前面3个字母依照月份的缩写进行排序。 -n: 依照数值的大小排序。 -u: 意味着是唯一的(unique),输出的结果是去完重了的。 -o: 将排序后的结果存入指定的文件。 -r: 以相反的顺序来排序。 -t: 指定排序时所用的栏位分隔字符。 +-: 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。 --help: 显示帮助。 --version: 显示版本信息。 4、sort命令的实践操作 范例1:在使用 sort

Shell排序 C&&C++

与世无争的帅哥 提交于 2019-12-05 22:36:40
Shell排序 Shell排序是大量数据需要排序时,更为高效的插入排序。它的算法思想基于插入排序的算法思想 流程: (1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等,以此类推 (2)一次循环使每一个数对排列好顺序 (3)变成n/4个数对,再次排序。 (4)不断重复上述过程,随着序列减少直至最后变为1个,完成排序。 具体如何怎么排的可以运行代码查看每一步排序。 #include<iostream> #include<cstdlib> #include<ctime> using namespace std; void ShellSort(int *a,int len) { int x,t,j; for (int r = len/2; r >=1 ; r/=2) //外层循环分组 { for (int i = r; i < len; i++) {//内层循环设置一定间距r,分别比较对应元素,当r=1时,这个时候就为插入排序,数组元素数量大时这时效率比插入排序高。 t=a[i]; j=i-r; while (j>=0&&t<a[j]) { a[j+r]=a[j]; j-=r; } a[j+r]=t; x++; cout<<"Sort result after "<<x<<" step"; //输出每一步排序结果 for (int k = 0; k < len

常用算法[转]

倾然丶 夕夏残阳落幕 提交于 2019-12-05 14:59:35
十种常见排序算法js 原文链接 https://www.cnblogs.com/onepixel/p/7674659.html 十种常见排序算法c 原文链接 https://blog.csdn.net/weixin_45855916/article/details/103041660 https://blog.csdn.net/kexuanxiu1163/article/details/103051357 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素

Linux:shell基础(九)

孤街浪徒 提交于 2019-12-03 12:06:43
字符处理命令 1、排序命令 :sort    sort [选项] 文件名     选项:     -f :忽略大小写     -n:以数值型进行排序(默认为字符串型进行排序)      -r:反向排序      -t:指定分隔符(默认分隔符为制表符)     -k n[,m]:按照指定的字段范围排序。从n字段开始,m字段结束。(默认到行尾)   sort -n -t ":" -k 3,3 /etc/passwd 按照第三个字段进行排序。(其中-n 是指定按照数值型排序,不然会出2在11 12 之后的情况) 2、统计命令:wc   wc [选项] 文件名   选项:     -l :只统计行数     -w:只统计单词数     -m:只统计字符数 来源: https://www.cnblogs.com/rtczza/p/11795584.html

shell脚本学习(7)sort

做~自己de王妃 提交于 2019-12-02 22:45:48
1 sort的格式 sort [options] [files] sort 参数 文件 2 参数 -t 用单个符char作为默认的字段分隔符, 默认字段分隔符是空白 参数-k 用来定义排序键值字段 一般是 -t分割好字段, 再在字段中 原始数据 t:说明原数据 按:分段 k1 说明指定字段1, 键值会从该字段的开始, 一直到字段结束而非字段的结尾。(也就是范围很大咯) 排序1 这种排序没看出是做什么用的 sort -t: -k1 /etc/passwd 排序2 k用逗号修饰, 表示排序键值由第一个字段值的开始出开始, 结束于第二个字段的结尾位置 这里1,1 是说键值用第一个字段表示 sort -t: -k1,1 /etc/passwd 和上面的结果没差别,但理论上不同 排序3 指定键值为第三段,并按数字比较,然后倒叙 sort -t: -k3,3nr /etc/passwd k的修饰符 n 表示按照数字(整数)比较 k的修改符 r 表示按照倒置排序 排序 4 先按字段4的整数排序, 再按字段3 的整数排序 通过写两个 -k 字段号,字段号n来实现 sort -t: -k4,4n -k3,3n /etc/passwd 比对这3组可以看出是先看第四字段排序了, 再按第三字段排 排序 5 只输出位置的排序记录,有点拗口, 就是比对的键值重复出现 sort -t: -k4,4n -u