插入排序

算法与结构--插入排序

雨燕双飞 提交于 2019-12-04 19:10:45
前言 万事万物皆算法,一切的始源与终点皆为 思想 。 在介绍插入算法之前,我们来简单回顾上一篇学的选择排序,选择排序基本思路就是每次遍历找到最小的元素放在首位置,这样他的时间复杂度是n2,但是由于其交换的次数不是很多,他的时间并没有冒泡排序等n2时间大。那么我们本节学习的插入排序有什么优势和缺点呢,废话不多说,割了 ------------------------------------------------------ 插入排序 怎么记住插入排序呢,大家都玩过扑克牌,每次抓玩牌整理纸牌的时候都会挑选出小牌插入到该有的位置,这个工程和插入排序很像,我们先看下插入排序的动图。 从图上可以看出,他的时间复杂度也为n2,而且每次插入会导致后面的元素都交换位置,大家都知道, 数组交换位置相比遍历要耗时的多 ,那么插入排序的优势在哪呢,我们先来写下代码,还是在上一篇的选择排序的基础上写。 /** * 插入排序 */ private static void insertSort(int arr[]) { for (int i = 1; i < arr.length; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { SortHelper.swapArr(arr, j, j - 1); } } } } 代码很简单

【算法导论】2-1 插入排序insertion-sort.cpp

孤街浪徒 提交于 2019-12-04 19:10:05
#include <iostream> using namespace std ; //插入排序算法,书p10 正确性证明见p11 时间复杂度o(n平方) int main1() { int a[ 10 ]={ 5 , 6 , 2 , 1 , 3 , 7 , 8 , 10 , 9 , 4 }; int time= 0 ; int j= 0 ,i= 0 ; int key= 0 ; for (j= 1 ;j< 10 ;j++) { key=a[j]; i=j- 1 ; while (i>= 0 &&a[i]>key) { time++; a[i+ 1 ]=a[i]; i=i- 1 ; //实际上是完成交换 } a[i+ 1 ]=key; for (i= 0 ;i< 10 ;i++) cout <<a[i]<< " " ; cout <<endl; } for (i= 0 ;i< 10 ;i++) cout <<a[i]<< " " ; cout <<endl; cout <<time<<endl; } //测试输出如下: //5 6 2 1 3 7 8 10 9 4 //2 5 6 1 3 7 8 10 9 4 //1 2 5 6 3 7 8 10 9 4 //1 2 3 5 6 7 8 10 9 4 //1 2 3 5 6 7 8 10 9 4 //1 2 3 5 6 7 8 10

排序算法---之插入排序(直接插入排序&希尔排序)

别来无恙 提交于 2019-12-04 19:08:04
排序算法--之插入排序 一、排序算法分为: 1.插入排序(直接插入排序&希尔排序) 2.交换排序(冒泡排序&快速排序) 3.选择排序(直接选择排序&堆排序) 4.归并排序 二、下面这张图对排序算法的时间复杂度&空间复杂度&稳定性做了一个总结: 二(1)、插入排序-----直接插入排序 1.算法代码(升序) //直接插入排序 void InsertSort(int *a,size_t n) { assert(a); for(size_t i=0;i<n-1;++i) { int end = i;//下标 int tmp = a[end+1];//要插入的那个数 while(end>=0) { if(a[end]>tmp) { a[end+1] = a[end]; --end; } else { break; } } a[end+1] = tmp;//若最小的数在最后一个,end会--到-1, } } //测试代码 void PrintArray(int* a,size_t n) { for(size_t i=0;i<n;++i) { cout<<a[i]<<" "; } cout<<endl; } //测试代码 void InsertSortTest() { int a[]={2,5,4,0,9,3,6,8,7,1}; PrintArray(a,sizeof(a)/sizeof(a

排序算法分析1--冒泡排序、插入排序、选择排序

邮差的信 提交于 2019-12-04 19:07:31
排序算法分析1--冒泡排序、插入排序、选择排序 0.综述 1.冒泡排序(Bubble sort) 1.1冒泡排序算法原理 1.2冒泡排序算法优化与代码实现 1.3冒泡排序算法分析 2.插入排序(Insertion sort) 2.1插入排序算法原理 2.2直接插入排序代码实现 2.3直接插入排序算法分析 2.4折半插入排序算法 3.选择排序(Slection sort) 3.1选择排序算法原理 3.2选择排序代码实现 3.3选择排序算法分析 0.综述 所谓排序,就是将原本无序的序列重新排列成有序序列的过程 。排序算法对任何一个程序员来说都是一项基本功,在实际的项目中我们也经常需要使用排序。排序算法的选择和使用不仅要针对实际数据的特点,有时候排序的稳定性也必须考虑。这样可以提高程序的运行效率,让开发工作事半功倍。 学习排序算法不能仅仅停留在了解算法原理和使用代码实现这两步,我们应该在此基础上学会去分析和评价一个算法 。我们可以从以下几各方面去衡量一个排序算法: 对于排序算法执行效率的分析 ,包括最好、最坏、平均情况下的时间复杂度,算法运行过程中数据比较和交换的次数等。 对于排序算法的内存消耗分析 。算法的内存消耗通过空间复杂度来衡量。 排序算法的稳定性 。所谓稳定性,就是待排序的序列中的值相同的元素经过排序算法处理后是否保持原先的位置关系,若保持,则称这个排序算法为稳定的排序算法

算法---1.插入排序

佐手、 提交于 2019-12-04 19:03:42
1.1直接插入排序 类似于扑克牌,假设前面的数据都是己排好序的,当下一个数据到来时, 先扫描要插入的位置,然后把数据插入。 1.2 代码 #include < stdio . h > #include < stdlib . h > #define dbmsg ( fmt , args . . . ) printf ( "%s:%s[%d]: " fmt "\n" , __FILE__ , __FUNCTION__ , __LINE__ , # # args ) int dump_arry ( int * arr , int len ) { int i ; for ( i = 0 ; i < len ; i + + ) { / / printf ( "%d=%d " , i , arr [ i ] ) ; printf ( "%d " , arr [ i ] ) ; } printf ( "\n" ) ; return 0 ; } //b.1顺序是不对的,先找到要插入的位置 int get_insert_position ( int * arr , int end_pos , int key ) { int i ; //end_pos 当前 要插入数据的位置 int start_pos ; // start_pos数据要插入的位置 / / printf ( "end_pos=%d\n

【转载】常见十大经典排序算法及C语言实现【附动图图解】

白昼怎懂夜的黑 提交于 2019-12-04 18:22:48
原文链接: https://www.cnblogs.com/onepixel/p/7674659.html 注意 : 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描述信息,后面会持续更新本文。 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 0.4 在线学习 这里提供两个算法可视化网站,方便理解这些排序算法: https://visualgo.net/en/sorting https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

插入排序

倾然丶 夕夏残阳落幕 提交于 2019-12-04 17:26:43
插入排序: 5 4 3 21:1位置开始比较,和他前面所有的数字进行比较4 5 3 22:2位置开始比较,和他前面所有的数字进行比较4 3 5 23 4 5 23:3位置开始比较,和他前面所有的数字进行比较3 4 5 23 4 2 53 2 4 52 3 4 5排好序了。依次把1坐标以后的所有元素,分别与它前面的元素进行比较如果发生了小于的情况就插入。原理:每次有一个数,它的前面都是排好序的,然后它要插入到排好的序列中,插入排序 def insert(nums): #从index=1开始比较相邻的两个元素 for i in range(1,len(nums)): #所有i坐标的元素都跟index=i前面的元素相比较,小于则交换元素 for j in range(i,0,-1): if nums[j-1] < nums[j]: nums[j],nums[j-1] = nums[j-1],nums[j] return nums print(insert([4,2,5,1])) 来源: https://www.cnblogs.com/ff-gaofeng/p/11875395.html

v8--sort 方法 源码 的 插入排序法

最后都变了- 提交于 2019-12-04 12:20:41
v8--sort方法源码中对于长度较短的数组使用的是插入排序法。 部分源码: function InsertionSort(a, from, to) { for (var i = from + 1; i < to; i++) { var element = a[i]; // Pre-convert the element to a string for comparison if we know // it will happen on each compare anyway. var key = (custom_compare || %_IsSmi(element)) ? element : ToString(element); // place element in a[from..i[ // binary search var min = from; var max = i; // The search interval is a[min..max[ while (min < max) { var mid = min + ((max - min) >> 1); var order = Compare(a[mid], key); if (order == 0) { min = max = mid; break; } if (order < 0) { min = mid + 1;

排序与搜索

我的未来我决定 提交于 2019-12-04 11:25:13
排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 稳定性 :稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。 当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4, 1) (3, 1) (3, 7)(5, 6) 在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有: (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,(比如上面的比较中加入第二个标准:第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。 一、冒泡排序 冒泡排序 (英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列

插入排序与希尔排序

霸气de小男生 提交于 2019-12-04 07:35:12
插入排序与希尔排序讲解   希尔排序是打破了O(n^2)时间复杂度的排序方法,它的理念基础是插入排序 插入排序概念   对同一个数组,我们构思出一个 有序数组arr[0] ,一个 无序数组arr[1] 开始,无序数组的遍历就是对有序数组的插入元素的筛选   相比较冒泡和选择的交换式排序方式,插入排序的替换方式更加简单,我们来直接看一下代码演示 插入排序代码 1.0版 /** * 插入排序 * 1.我们可以看做有两个数组,分别是有序和无序的 * 有序:arr[0]开始 * 无序:arr[1]开始 * 我们每次从无序的数据中获取一个,插入到有序列表中,只需要判断当 插入的数据 > 有序中的数据就可以了 * 原因:有序数据本身就是有序的 * */public void insertSorting(int[] arr){ int a; int value = arr[1]; //记录需要插入的数据 //第一次排序 for(a=0;a>=0;a--){ if(arr[a] < value){ arr[a+1] = value; break; }else{ arr[a+1] = arr[a]; } } arr[a+1] = value; //第二次排序 value = arr[2]; for(a=1;a>=0;a--){ if(arr[a] < value){ arr[a+1] = value