插入排序

排序算法

北战南征 提交于 2019-11-28 16:15:23
排序算法 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n) 选择排序 O(n2) O(n2) 不稳定 O(1) 二叉树排序 O(n2) O(n*log2n) 不稳定 O(n) 插入排序 O(n2) O(n2) 稳定 O(1) 堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1) 希尔排序 O O 不稳定 O(1) 堆排序 O(nlogn) O(nlogn) 不稳定 O(1) 3.排序算法的思想: (1)冒泡排序: 是相邻元素之间的比较和交换,两重循环O(n2);所以,如果两个相邻元素相等,是不会交换的。所以它是一种稳定的排序方法 (2)选择排序: 每个元素都与第一个元素相比,产生交换,两重循环O(n2);举个栗子,5 8 5 2 9,第一遍之后,2会与5交换,那么原序列中两个5的顺序就被破坏了。所以不是稳定的排序算法 (3)插入排序: 插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。刚开始这个小序列只包含第一个元素,事件复杂度O(n2)。比较是从这个小序列的末尾开始的。想要插入的元素和小序列的最大者开始比起,如果比它大则直接插在其后面,否则一直往前找它该插入的位置。如果遇见了一个和插入元素相等的

数据结构知识点汇总

♀尐吖头ヾ 提交于 2019-11-28 16:12:35
1、用链表表示线性表的优点是(便于插入和删除操作) 2、单链表中,增加头结点的目的是(方便运算的实现) 3、栈和队列的共同特点是(只允许在端点处插入和删除元素) 4、栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5、队列具有(先进先出)的特征,栈具有(后进先出)的特征。 6、链表(插入和删除不需要移动元素,但是无法随机访问任一元素) 7、循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 8、线性表(除了第一个和最后一个元素外,其余每个元素都有一个直接前驱和直接后继) 9、线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 10、深度为5的满二叉树中,叶子结点的个数为(16)。 其共有(31)个结点。 设一棵完全二叉树共有699个结点。则该二叉树的叶子结点数为(350)个。 #完全二叉树总的结点数为N,若N为奇数,则叶子结点数为(N+1)/2;若N为偶数,则叶子结点数为N/2。 11、具有3个结点的二叉树有(5)种形态。 #高度为2层的是:根-左-右。高度为3层的是:根-左-左、根-左-右、根-右-右、根-右-左。 12、一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13)个。 #叶子结点数n0与度为2的结点数n2的关系是:n0=n2+1,所以度为2的结点个数为3-1=2。所以总的结点数为 n

排序之插入排序

半世苍凉 提交于 2019-11-28 16:03:34
直接插入排序:时间复杂度为0(n^2) 第i个元素之前的元素已经排序好了,要把数组中的第i个元素排入已经排好的元素中,i要与i-1,i-2.......等元素比较,i大于他们就终止排序,i小于i-1或其他的就把i与他们交换,实现排序的功能 using System; using System.Collections.Generic; using System.Diagnostics;//StopWatch类的命名空间 using System.Linq; using System.Text; using System.Threading.Tasks; namespace 直接插入排序 { class Program { static void Main(string[] args) { int[] array = new int[] { 42, 20, 99, 12, 44, 4, 66, 88, 24, 93 ,1,22};//需要排序的数组 Stopwatch watch = new Stopwatch();//创建StopWatch类的对象 watch.Start();//调用类中的start函数开始计时 Sort(array);//调用直接插入排序函数对数组进行排序 watch.Stop();//调用StopWatch类中的stop函数,终止计时 Console

程序员那些必须掌握的排序算法(上)

我是研究僧i 提交于 2019-11-28 15:02:10
现在的IT行业并不像以前那么好混了,从业人员过多,导致初级程序员过剩,这也间接导致了公司的招聘门槛越来越高,要求程序员掌握的知识也越来越多。 算法也是一个争论了很久的话题,程序员到底该不该掌握算法?不同的人有不同的答案,而事实上,很多公司都对算法有一定的要求,有些公司直接在面试的时候便会要求面试者手写算法题。这就对程序员的技术要求产生了很大的考验,所以面对如今的大环境,我们必须掌握算法,才能在今后的工作中占据一席之地。 那么接下来,我就简单介绍一下几个排序算法,希望对你们有所帮助。 1.冒泡排序 冒泡排序(Bubble Sort),是一种较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 演示: 代码如下: @Test public void bubbleSort() { int[] arr = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 }; // 统计比较次数 int count =

排序算法学习[3] 插入排序

纵饮孤独 提交于 2019-11-28 14:51:11
4.插入排序 插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 \(O(n^2)\) 。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入到前面已经排序的数组中的适当位置上,直到全部插入完为止。 来源: https://www.cnblogs.com/hellovan/p/11410777.html

数据结构和算法 (二)

不想你离开。 提交于 2019-11-28 13:48:24
数据结构(swift实现)一 1. 常用数据结构 1. 1 数组 1. 2 字典 1. 3 链表 1. 4 堆栈 1.4.1 堆 1.4.2 栈 1.5 队列 1.5.1 优先队列 1.5.2 循环队列 1.6 树 1.6.1 二叉树 1.6.2 二叉搜索树 1.6.3 平衡二叉树 1.7 图 2. 常用算法 2.1 查找算法 2.1.1 二分查找 2.1.2 广度优先搜索算法 2.1.3 深度优先搜索算法 2.2 排序算法 2.2.1 排序算法简介 2.2.2 排序算法比较 2.2.2.1 稳定性比较 2.2.2.2 时间复杂度比较 2.2.2.3 辅助空间比较 2.2.2.4 其他比较 2.2.3 排序算法实现 2.2.3.1 插入排序 2.2.3.2 选择排序 2.2.3.3 冒泡排序 2.2.3.4 快速排序 2.2.3.5 堆排序 2.2.3.6 归并排序 2.2.3.7 希尔排序 2.2.3.8 二叉树排序 2.2.3.9 计数排序 2.2.3.10 桶排序 2.2.3.11 基数排序 2.2.3.12 1. 常用数据结构 1. 1 数组 1. 2 字典 1. 3 链表 1. 4 堆栈 1.4.1 堆 1.4.2 栈 1.5 队列 1.5.1 优先队列 1.5.2 循环队列 1.6 树 1.6.1 二叉树 1.6.2 二叉搜索树 1.6.3 平衡二叉树 1.7 图 2.

排序---希尔排序

烈酒焚心 提交于 2019-11-28 11:08:35
希尔排序可以说是插入排序的优化,算法的时间复杂度为O(nlogn),算法不稳定 在数字比较多的时候,希尔排序在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动 void ShelSort(int *src, int n) { int i, j, k; int gap, tmp; for (gap = n / 2; gap; gap /= 2) { for (k = 0; k < gap; k++) { for (i = gap + k; i < n; i += gap) { tmp = src[i]; for (j = i; j >= gap && src[j - gap] > tmp; j -= gap) { src[j] = src[j - gap]; } src[j] = tmp; } } } } 来源: https://blog.csdn.net/qq_44783220/article/details/100053570

希尔排序(附图)

旧巷老猫 提交于 2019-11-28 07:45:25
希尔排序是插入排序的进阶版。 它的基本思想是把一个大的数据集合以条件分割成若干个组合,每个组合进行插入排序。此时插入排序数据量较小,排序的效率更高。 public void xrpx(int arr[]) { for (int interval=arr.length/2; interval>0; interval=interval/2) { for (int j=interval; j<arr.length; j++) { int target = arr[j]; int index = j-interval; while (index >= 0 && target < arr[index]) { arr[index+interval] = arr[index]; index-=interval; } arr[index+interval] = target; } } } 详细步骤解说可以参考:https://blog.csdn.net/qq_39207948/article/details/80006224 来源: https://www.cnblogs.com/z1110/p/11399803.html

简单排序——冒泡、选择、插入

≡放荡痞女 提交于 2019-11-28 07:39:50
冒泡排序:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 插入排序:插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 package com

常用排序算法的稳定性分析

China☆狼群 提交于 2019-11-28 06:44:07
一、不稳定排序算法有哪些 1、堆排序 2、希尔排序 3、快速排序 4、选择排序 口诀: 一堆 (堆) 希尔 (希尔) 快 (快速) 选 (选择) 二、常见排序算法稳定性分析 1、堆排序稳定性分析 我们知道堆的结构是节点i的孩子为 2*i 和 2*i+1 节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其 2 个子节点。 在一个长为 n 的序列,堆排序的过程是从第 n/2 开始和其子节点共 3 个值选择最大(大顶堆)或者最小(小顶堆),这 3 个元素之间的选择当然不会破坏稳定性。 但当为 n/2-1, n/2-2, ...1 这些个父节点选择元素时,就会破坏稳定性。 有可能第 n/2 个父节点交换把后面一个元素交换过去了,而第 n/2-1 个父节点把后面一个相同的元素没有交换,那么这 2 个相同的元素之间的稳定性就被破坏了。 所以,堆排序不是稳定的排序算法。 2、希尔排序 希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快; 当元素基本有序时,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比 O(N^2) 好一些。 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序, 但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱