排序算法

【算法】排序(三)插入排序

帅比萌擦擦* 提交于 2020-02-27 19:27:14
上次给大家说了说简单的冒泡排序,这次我们来说一说插入排序 插入排序的做法就像是我们日常生活中玩扑克牌一样,每次抽一张牌,将扑克牌按一定顺序插入手牌中,一步步完成排序 本文将介绍以下内容 排序思想 算法实现(JAVA) 测试阶段 排序过程讲解 算法分析 排序思想 插入排序同样有内循环和外循环,外循环执行n - 1次,内循环负责比较相邻两个数的大小并交换(如果需要)。每次将未排序序列里的第一个数与后一个数比较,如果后者小,就交换二者的位置,并和以排序的序列元素依次比较并交换(如果需要)。 就如同玩扑克牌,每次抽取的一张牌都要与所有手牌一对一比较,并确定最终插入的位置。 算法实现 1. 外循环 public static void insertionSort(int[] a) { int n = a.length; for (int i = 1; i < n; i++) { } } 循环次数为n - 1,否则数组下标越界,下文会说明原因。 2. 内循环 for (int j = i; j > 0 && a[j] < a[j - 1] ; j--) { int temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; } 交换条件为后一项小于前一项,每次都是a[j]与a[j - 1] 比较,所以只能有n - 1 次循环,否则数组下标越界。 所以

C# 选择排序,冒泡排序,快速排序之效率比对

被刻印的时光 ゝ 提交于 2020-02-27 13:58:19
数据的排序方法有多种,每种排序都有各自的特点和优点,在实际的使用中需要根据实际的情况灵活的选择排序方式,不仅可以提高效率,还可以节约资源。以下用选择排序,冒泡排序和快速排序三种排序方法对相同大小的数据进行排序效率的比较。 以下是设计器代码: 1 namespace SortsCompare 2 { 3 partial class FormSort 4 { 5 /// <summary> 6 /// 必需的设计器变量。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 清理所有正在使用的资源。 12 /// </summary> 13 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region

归并排序

淺唱寂寞╮ 提交于 2020-02-27 10:50:55
时间复杂度O(nlogn),但是空间复杂度O(n). 算法 递归的将前半部分数据和后半部分数据各自归并排序 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。 2.设定两个指针left[0]和right[0],最初位置分别为两个已经排序序列的起始位置。 3.比较两个指针所指向的元素,选择相对小的元素pop出来,append到合并空间,并移动指针到下一位置(因为用了pop函数,所以下一位置是新的left[0或right[0]). 4.重复步骤 3 直到某一指针达到序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。 算法分析 采用了经典的 分治策略 ,它将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段解得的各个答案修补到一起。 图解 代码 这里我们定义两个函数,一个用于递归的进行排序,另一个用于合并两个已经排序的部分。 import math #用到math.floor函数 向下取整 def mergesort ( arr ) : #递归的拆分排序 if len ( arr ) < 2 : return arr mid = math . floor ( len ( arr ) / 2 ) left = arr [ 0 : mid ] right = arr [ mid : ] a = mergesort ( left ) b = mergesort

算法之排序(上)-c语言实现

旧街凉风 提交于 2020-02-27 09:23:56
文章来源: http://blog.seclibs.com/算法之排序(上)-c语言实现/ 在上一篇文章中,我们说了时间复杂度为 O(n2)的几个排序算法,冒泡排序、插入排序、选择排序,在理解上和实现上都没有太难的地方,这里在实现的时候,没有再自己实现数组或链表,而是使用了c语言自带的数组进行实现的,代码中没有太难理解的地方,就直接上代码了 如果需要下载代码,请移步文末 代码: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3163271

「算法」按奇偶排序数组 & 按奇偶排序数组II

◇◆丶佛笑我妖孽 提交于 2020-02-27 09:23:40
00905 按奇偶排序数组 题目描述 给定一个非负整数数组 A ,返回一个数组,在该数组中 A 的所有偶数元素之后跟着所有奇数元素。 你可以返回满足此条件的任何数组作为答案。 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。 提示: 1 <= A.length <= 5000 0 <= A[i] <= 5000 力扣地址 https://leetcode.com/problems/sort-array-by-parity/ https://leetcode-cn.com/problems/sort-array-by-parity/ <!-- more --> 解题报告 两遍扫描 本题解由微信公众号 小猿刷题 提供, 错误之处, 欢迎指正. 第一遍扫描输出偶数, 第二遍扫描输出奇数. /** * 微信公众号"小猿刷题" */ class Solution { public int[] sortArrayByParity(int[] A) { int[] list = new int[A.length]; int t = 0; for (int i = 0; i < A.length; i++) { if (A[i] % 2 == 0){ list[t++] = A[i]; } } for

算法之排序(上)

守給你的承諾、 提交于 2020-02-27 08:02:47
文章来源: http://blog.seclibs.com/算法之排序(上)/ 排序算法有很多种,甚至有很多都完全没有听过,我们最常见,也最经典的就是:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 按照时间复杂度来进行划分可以将其划分为三类 O(n2) :冒泡、插入、选择;基于比较 O(nlogn):快排、归并;基于比较 O(n):桶、计数、基数;不基于比较 这次我们来说时间复杂度为O(n2)的 在说具体的排序方法之前,先明确排序算法的评价标准 首先是排序算法的执行效率,执行效率一般从最好、最坏、平均时间复杂度上分析,其分析时间复杂度时需要考虑系数、常数和低阶,因为时间复杂度是在数据规模特别大的时候的增长趋势,在平时的代码中,数量级都是比较小的,所以还需要考虑这些问题。在基于比较的排序算法中,数值比较的次数和数据的移动次数也都是需要考虑进去的。 其次是内存的消耗,算法的内存消耗可以用空间复杂度来表示,当空间复杂度为O(1)的算法也可以称之为原地排序算法。 最后是算法的稳定性,当一组数据中有两个相同的值时,排序之后两个值的顺序是如果没有交换那它就是具有稳定性的算法。 然后我们再引入两个概念, 有序度 和 逆序度 有序度 是数组中具有有序关系的元素对的个数。 比如说2、4、3、1、5、6这组数组的有序度是11,因为它有11个有序元素对,分别是(2,4)

Java实现的5大排序算法

会有一股神秘感。 提交于 2020-02-27 06:48:12
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。 废话不多说,下面逐一看看经典的排序算法: 1、Java排序算法之选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。 举个实例来看看: 1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11] 2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2]) 4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17]) 6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16]) 8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 ) 10.11.i = 4: [2, 7, 11, 16, 16 ,

Hadoop初体验——搭建hadoop简单实现文本数据全局排序

*爱你&永不变心* 提交于 2020-02-27 02:22:08
之前在实现一些机器学习算法时,跑数据量、feature很多的数据集往往要耗费很多时间,尤其是处理大量文本数据时候,单机跑算法的时间让我无法容忍,理论上如果合理的将大数据量分布式并行计算框架(例如hadoop)应用到这些算法上能有效提高算法执行速度(当然,要求算法本身可以全部或部分进行并行化处理),下一步想要学习Mahout( http://mahout.apache.org/ ),它的目标是: build scalable machine learning libraries ,它是基于hadoop的,所以在此之前需要学习一下Hadoop,先从hadoop搭建开始吧。 1、硬件、软件准备 手头上有三台配置一样的电脑,就不去装虚拟机了,配置如下: CPU:Intel(R) Pentium(R) Dual CPU E2200 @ 2.20GHz Memory:2001MiB Network:NetLink BCM5786 Gigabit Ethernet 三台电脑装有相同的操作系统——Ubuntu 11.04 2、安装过程 任选一台机器作为master,其他机器作为slaves,所有机器拥有相同的用户、相同的环境变量配置、相同的hadoop目录结构、相同的Java目录结构。 (1)、更改host文件 master机器:在终端执行:sudo gedit /etc/hosts,添加以下信息

STL算法积累(二)

做~自己de王妃 提交于 2020-02-26 23:02:21
C++ sort stable_sort partial_sort nth_element is_sorted is_sorted_until [1]C++ sort(STL sort)排序算法详解 //默认升序 1.1 在很多应用中,排序都是至关重要的,而且很多 STL 算法也只适用于有序对象序列。定义在 algorithm 头文件中的函数模板 sort<Iter>() 默认会将元素段排成升序,这也就意味着 排序的对象的类型需要支持 < 运算符。 1.2 对象也必须是可交换的,这说明可以用定义在 utility 头文件中的函数模板 swap() 来对两个对象进行交换。这进一步表明这种对象的类型需要实现移动构造函数和移动赋值运算符。 1.3 函数模板 sort<Iter>() 的类型参数 Iter 是元素段元素对应的迭代器类型,而且它们必须支持随机访问迭代器。这表明 sort() 算法只能对提供随机访问迭代器的容器中的元素进行排序, 也说明 sort() 只能接受 array、vector、deque 或标准数组中的元素。可以回顾前面章节,list 和 forward_list 容器都有成员函数 sort(); 这些用来排序的特殊成员函数是必要的, 因为 list 只提供双向迭代器,且 forward_list 只提供正向迭代器。 可以从函数调用的参数中推导出 sort()

NOIP 双栈排序(贪心算法)

跟風遠走 提交于 2020-02-26 22:38:58
题目描述 Tom最近在研究一个有趣的排序问题。如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序。 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1不为空,将S1栈顶元素弹出至输出序列 操作c 如果输入序列不为空,将第一个元素压入栈S2 操作d 如果栈S2不为空,将S2栈顶元素弹出至输出序列 如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”。例如(1,3,2,4)就是一个“可双栈排序序列”,而(2,3,4,1)不是。下图描述了一个将(1,3,2,4)排序的操作序列:<a,c,c,b,a,d,d,b> 当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),<a,c,c,b,a,d,d,b>是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。 【输入】 输入文件twostack.in的第一行是一个整数n。 第二行有n个用空格隔开的正整数,构成一个1~n的排列。 【输出】 输出文件twostack.out共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。 【输入输出样例1】 输入: 4 1 3 2 4 输出: a b a a b b a b 思路 能弹出,则弹出