插入排序

插入排序

拜拜、爱过 提交于 2019-12-11 19:33:17
代码如下 public static void insertionSort(int[] a,int n){ if (n <= 1) { return; } for ( int i = 1; i < n; i++ ) { int value = a[i]; int j = i - 1; for ( ; j>=0; j--) { if ( a[j] > value) { a[j+1] = a[j]; } else { break; } } a[j+1] = value; } } 插入排序是一种原地、稳定排序算法。 如果要排序的数据已经是有序的,不需要搬移任何数据。如果我们从尾到头在有序数据组里面查找插入位置,每次只需要比较一个数据就能确定插入的位置。所以这种情况下,最好是时间复杂度为 O(n)。 如果数组是倒序的,每次插入都相当于在数组的第一个位置插入新的数据,所以需要移动大量的数据,所以最坏情况时间复杂度为 O(n2)。平均时间复杂度为 O(n2)。 来源: CSDN 作者: zt_star 链接: https://blog.csdn.net/zt_star/article/details/103489618

十大排序算法之希尔排序

99封情书 提交于 2019-12-11 07:37:23
简介 插入排序对于大规模的乱序数组,插入排序会很慢,因为它只会交换相邻的元素,元素只能一点一点的从数组的一端移动到另一端。如果最小的元素在数组的末尾,则要将它移动到数组的开头则需要进行n-1次移动。 希尔排序改进了插入排序这一问题,它交换不相邻的元素对数组进行局部排序,并最终用插入排序将局部有序的数组进行排序。 希尔排序的思想就是使得数组中任意间隔h的元素都是有序的,这样的数组可以成为h有序数组。这里拿数组a={4,8,9,1,10,6,2,5}为例,当h为4时,会将这个数组分为h个子数组。 实例 Java 代码 public class Main { public static void main ( String [ ] args ) { int [ ] sort = { 3 , 2 , 1 , 4 , 6 , 5 , 8 , 9 , 10 , 7 } ; System . out . println ( "排序前:" ) ; printArray ( sort ) ; shellSort ( sort ) ; System . out . println ( "\n排序后:" ) ; printArray ( sort ) ; } public static void printArray ( int [ ] a ) { for ( int i = 0 ; i < a .

插入排序

旧巷老猫 提交于 2019-12-10 05:24:47
描述 采用插入排序对数据进行从小到大排序 输入 二行 第一行数据个数n 第二行:具体数据 输出 从小到大排序 样例输入 5 12 45 32 86 10 样例输出 10 12 32 45 86 代码: #include<iostream> #include<cstdio> int a[110]; using namespace std; void insertSort(int r[],int n) { for(int i=2;i<=n;i++) { r[0]=r[i]; int j=i-1; while(r[0]<r[j]) { r[j+1]=r[j]; j=j-1; } r[j+1]=r[0]; } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } insertSort(a,n); for(int i=1;i<=n;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; } 来源: CSDN 作者: 淼润淽涵 链接: https://blog.csdn.net/wcxyky/article/details/103464545

插入排序

和自甴很熟 提交于 2019-12-10 00:31:56
一、插入排序(InsertSort) 插入排序从第二个数开始,拿出第二个数进行向前插入排序,一直到最后一个数向前做插入排序。 算法稳定。 插入排序的 时间复杂度为O(n^2),空间复杂度为O(1)。 最好的时间复杂度是O(n),最坏也就是平均是O(n^2) 二、图解 对于一串数字(3,5,2,1,4,10)进行插入从小到大排序,如下图演示 三、算法实现 package com.arithmetic.sort; /** * @Description * 功能:实现插入排序 * 从第二个数开始,拿出第二个数进行向前插入排序,一直到拿到最后一个数向前做插入排序 * 时间复杂度O(n^2);空间复杂度O(1);稳定;算法复杂度最好O(n),不需要加条件实现,最坏情况是O(n^2) * @Author xuexue * @Date 2019/11/9 22:25 */ public class InsertSort { public static void main(String[] args) { int[] arrs = new int[]{3, 5, 2, 1, 4, 10}; insertSort(arrs); for (int arr : arrs) { System.out.println(arr); } } /** * 算法:插入排序 * 需要选择作为插入的数:从第二个开始

20191209-八大排序之插入排序

*爱你&永不变心* 提交于 2019-12-09 21:00:52
1. 插入排序 算法核心思想 插入排序的核心思想是将数组中所有的元素分别和前面已经排序好的元素相比较,如果后面选择的元素比已排序的元素小,则交换位置,直至比较完成。具体逻辑如下: 取数组的第一个元素为已经排序好的元素,将第一个元素看作有序序列 取数组的第二个元素和已经排序号的元素进行比较,如果第二个元素比第一个元素小,则交换位置,排序完成后第一个元素和第二个元素必然有序,形成新的有序数列 取数组的第三个元素,依次和第一个第二个元素进行比较,排序完成后第一个,第二个,第三个元素形成一个有序数列 取最后一个元素重复上述步骤,最终实现整个数组有序 代码实现 while版本 def myInsertSort(arr): for i in range(1,len(arr)):#默认第0号索引的元素是一个已经排好序的序列,所以从第一个元素开始 j = i#此时arr[:j]是一个已经排好序的序列,使用arr[i](arr[j+1])和arr[:j]依次作比较 while j>=1: if arr[j-1]>arr[j]: arr[j-1],arr[j] = arr[j],arr[j-1] else: break j-=1 return arr s = [93,28,1,1,2,3,4,5,6,2,3,4,5,-99,-98,-99,0] print(myInsertSort(s))

简单排序算法——插入排序

放肆的年华 提交于 2019-12-09 19:34:31
插入排序: 之前在学习插入排序时,在网上看到了一个直观的图解: 基本原理解释: 利用插入法对无序数组排序时,我们其实是 将数组R划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。 插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区 。因为这种方法每次使有序区 增加1个记录,通常称增量法。 稳定 空间复杂度O(1) 时间复杂度O(n 2 ) 最差情况:反序,需要移动n*(n-1)/2个元素 最好情况:正序,不需要移动元素 数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n); 插入排序最坏情况运行时间和平均情况运行时间都为O(n 2 )。 根据自己的理解写了两个代码: 执行代码: (1) package sdx; import java.util.Arrays; public class Main8c { public static void Main(int a[]){ int i,j,t,index; for(i=1;i<a.length;i++){ index=a[i]; for(j=i-1;j>=0&&a[j]>index;j--){ a[j+1]=a[j]; a[j]=index; } } } public static

C/C++实现插入排序

有些话、适合烂在心里 提交于 2019-12-09 17:15:49
插入排序 - 数列前面部分看为有序,依次将后面的无序数列元素插入到前面的有序数列中,初始状态有序数列仅有一个元素,即首元素。在将无序数列元素插入有序数列的过程中,采用了逆序遍历有序数列,相较于顺序遍历会稍显繁琐,但当数列本身已近排序状态效率会更高。 时间复杂度:O(N2)   稳定性:稳定 /*插入排序*/ void insertSort ( vector < int > & arr , int bgn , int end ) { for ( int i = bgn + 1 ; i < end ; ++ i ) { /* * 分为1,2两部分处理,可以囊括j = beg - 1时的情况 * 即需要将arr[i]插入到首元素前的位置,若使用一个for * 包括这两部分,则会在发生这种情况时退出 */ /*1*/ int j = i - 1 ; for ( ; j >= bgn ; -- j ) if ( arr [ j ] <= arr [ i ] ) break ; /*2*/ if ( j != i - 1 ) { int temp = arr [ i ] ; for ( int k = i ; k > j + 1 ; -- k ) { arr [ k ] = arr [ k - 1 ] ; } arr [ j + 1 ] = temp ; } } } 来源: CSDN 作者:

数据结构之排序算法(八大排序)-(八)

坚强是说给别人听的谎言 提交于 2019-12-07 22:08:40
排序算法可以分为稳定排序和不稳定排序。在简单形式化一下,如果A[i] = A[j],A[i]原来在位置前,排序后A[i]还是要在A[j]位置前,这才能叫稳定排序。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,对基于比较的排序算法而言,元素交换的次数可能会少一些(个人感觉,没有证实)。 回到主题,现在分析一下常见的排序算法的稳定性,每个都给出简单的理由。 (1)冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。 (2)选择排序 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n - 1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面

八大排序算法

妖精的绣舞 提交于 2019-12-07 22:03:57
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 本文将依次介绍上述八大排序算法。 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法步骤 : 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。) 代码实现: void insert_sort(int array[],unsignedint n) { int i,j; int temp; for(i = 1;i < n;i++) { temp = array[i]; for(j = i;j > 0&& array[j - 1] > temp;j--) { array[j]= array[j - 1]; } array[j] = temp; } } 算法二:希尔排序 希尔排序示意图 希尔排序 ,也称

数据结构之排序算法

痞子三分冷 提交于 2019-12-07 22:01:12
作者:离散梦 欢迎大家给出宝贵的建议! 数据结构之排序算法 稳定排序 :冒泡、插入、归并、基数 不稳定排序 :选择、快速、希尔、堆 口诀就是: 快 (快速) 些 (希尔) 选 (选择) 一 堆 (堆) 好朋友来玩吧! 1.冒泡排序 冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。【时间复杂度为O(n^2),最好的情况就是有序的时候为O(n)】 算法思想过程: 冒泡排序算法——python实现程序 2.选择排序 选择排序(Selection Sort )就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。【时间复杂度为O(n^2)】 算法思想过程: 选择排序算法——python实现程序 3.插入排序 插入排序(Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。【时间复杂度为O(n^2),最好的情况是排好序的时候为O(n)】 算法思想过程: 注:下面排序之后答案是1,2,3,4,5,6,7,8.我下面这幅图有些许错误,就不重新作图了。 插入排序算法——python实现程序 4.归并排序 归并排序(Merging Sort)就是利用归并的思想实现的排序方法