插入排序

用AS3实现插入排序算法

こ雲淡風輕ζ 提交于 2020-03-17 18:20:41
插入排序 (Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置中 6.重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。 维基百科 代码:稍后整理.... 来源: https://www.cnblogs.com/finger/archive/2012/05/19/2508988.html

[算法] 插入排序 Insertion Sort

孤者浪人 提交于 2020-03-17 18:20:16
插入排序(Insertion Sort) 是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序 在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 一般来说, 插入排序 都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是 插入排序 的一个变种,称为二分查找插入排序。 从数据第二个元素开始遍历 0 1 2 3 4 5 20 40 30 10 60 50 20 40 30 10 60 50 20 30 40 10 60 50 10 20 30 40 60 50 10 20 30 40 50 60 i=1; temp=a[1]=40; j=i-1=0; a[0]>40,若前面的元素比当前元素大。 i=2; temp=a[2]=30, j=i-1=1;a[1]

数据结构与算法之比较排序算法总结

喜欢而已 提交于 2020-03-13 14:53:32
介绍: 比较算法大致可以分为两种,一种为比较算法,另一种为非比较算法。 比较算法有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序。 非比较算法有:计数排序,基数排序,桶排序。 https://gitee.com/linqiankun/Utils/tree/v3.0/ 时间复杂度: 排序方法 最好情况 平均情况 最差情况 辅助空间 稳定性 冒泡排序 n n^2 n^2 1 yes 选择排序 n^2 n^2 n^2 1 no 插入排序 n n^2 n^2 1 yes 归并排序 nlogn nlogn nlogn n yes 堆排序 nlogn nlogn nlogn 1 no 快速排序 nlogn nlogn n^2 1 no 希尔排序 n^1.3 nlogn~n^2 n^2 logn~n no 比较算法: 冒泡排序 普通冒泡排序 冒泡排序是一种极为简单的排序算法。通过循环反复的遍历数组中的元素,依次比较相邻的两个元素。如果不满足排序规则,就进行位置交换,直到没有元素需要交换位置,排序完成。 这个算法会慢慢的使元素按照需要的顺序浮出来。 时间复杂度为:O(n)~O(n^2)~O(n^2) 冒泡排序运行顺序: 比较相邻元素,按照排序规则进行位置交换。 对每一对相邻元素进行第一步的操作,操作完之后,队伍最后会是满足条件的数。循环体的内层循环走完一圈。

插入排序、希尔排序

最后都变了- 提交于 2020-03-10 06:31:07
插入排序 基本思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 void InsertSort ( vector < int > & v ) { for ( int i = 1 ; i < v . size ( ) ; i ++ ) { int k = v [ i ] ; int j ; for ( j = i - 1 ; j >= 0 ; j -- ) { if ( k < v [ j ] ) v [ j + 1 ] = v [ j ] ; else break ; } v [ j + 1 ] = k ; } } 特性总结: 元素集合越接近有序,直接插入排序算法的时间效率越高。 平均时间复杂度:O(N^2)。 空间复杂度:O(1)。 稳定性:稳定。 希尔排序 基本思想: 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 void ShellSort ( vector < int > & v ) { int gap = v . size ( ) ; while ( 1 ) { gap = ( gap / 3 ) + 1 ; for ( int i = gap ; i < v . size ( ) ;

插入排序 python实现

随声附和 提交于 2020-03-10 05:53:41
插入排序 python实现 原理 逐个元素排查,第一个元素默认已排序,从第二个元素开始,比较当前元素与前一个元素的大小,前一个元素大于当前元素,则交换两个元素位置,交换后再用已经交换到前一个位置的当前元素与现位置的前一个元素比较,直到无需交换,进入下一个元素,以此类推,遍历完所有位置的元素。 运行时间 最坏:原数组完全逆序 Ω(n^2) 最好:原数组已基本排序或完全排序 O(n) 实现 精简 import copy import time # 插入排序法 def insert_func ( obj ) : """ 排序中不写入当前值,每轮最后写入 """ for i in range ( 1 , len ( obj ) ) : current = obj [ i ] j = i while j > 0 and obj [ j - 1 ] > current : obj [ j ] = obj [ j - 1 ] j -= 1 obj [ j ] = current 加打印版 import copy import time # 插入排序法 def insert1 ( obj ) : """ 排序中不写入当前值,每轮最后写入 :param obj: 未排序数组 :return: obj: 排序后数组 """ t1 = time . time ( ) print ( "未排序之前数组:{

案例7-1.2 插入排序还是归并排序 (25分)

我的梦境 提交于 2020-03-08 13:05:37
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 输出格式: 首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。 输入样例 1: 10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 输出样例 1: Insertion Sort 1 2 3 5 7 8 9 4 6 0 输入样例 2: 10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6 输出样例 2: Merge Sort 1 2 3 8 4 5 7

数据结构——复习九(排序)

微笑、不失礼 提交于 2020-03-08 06:37:30
排序 稳定排序和不稳定排序 假设Ri=Rj(0<=i,j<=n-1,i≠j),且在排序前的序列中Ri领先于Rj(即i<j),若在排序后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的,否则是不稳定的。 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 插入排序:直接插入排序、折半插入排序、希尔排序、表插入排序 交换排序:起泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 分配排序 插入排序 直接插入排序 上面的过程很直观,挺简单的,对我来说比较好理解 //我自己写了一种,还有一种都是一样的,后面那种对理解shell排序比较有帮助 void straisort ( int r [ ] , int n ) { int i , j , k ; for ( i = 2 ; i <= n ; i ++ ) { r [ 0 ] = r [ i ] ; j = i - 1 ; for ( k = 1 ; k <= j ; k ++ ) { if ( r [ 0 ] < r [ k ] ) r [ k + 1 ] = r [ k ] ; else { r [ k + 1 ] = r [ 0 ] ; break ; } } } } void straisort ( int r [ ] , int n ) { int i , j ; for (

二分法插入排序

ぐ巨炮叔叔 提交于 2020-03-06 21:49:30
#include "stdio.h" #include "malloc.h" typedef int KeyType; typedef int DataType; typedef struct { //排序码字段 KeyType key; //记录的其他字段 DataType info; }RecordNode; typedef struct { int n; RecordNode * record; }SortObject; void binSort(SortObject * pvector) { int i,j,left,right,middle; RecordNode temp; for(i=0;i<pvector->n;i++) { temp=pvector->record[i]; left=0; right=i-1; while (left<=right) { middle=(left+right)>>1; if (temp.key<pvector->record[middle].key) { right=middle-1; } else { left=middle+1; } } for(j=i-1;j>=left;j--) { pvector->record[j+1]=pvector->record[j]; } if (left!=i) { pvector-

二分法插入排序

怎甘沉沦 提交于 2020-03-06 21:49:14
一、二分法插入排序 基本思路:每次将一个待排序的数记录下,按其顺序大小,用二分法找到合适位置插入到前面已经排序的字序列(从后向前找到合适位置),直到全部插入排序完为止。 1.1 C实现 #include<stdio.h> #include<stdlib.h> int arr_num[]; int length; void insert_sort(int length) { int i; for(i=1; i<length; i++) { int temp; int low, high, mid; temp = arr_num[i]; low=0; high=i-1; while(low<=high) { mid = (low + high)/2; //通过二分法,找到记录值合适的位置 if(temp>a[mid]) { low = mid+1; } else { high = mid-1; } } //将记录值该在的位置腾出来 for (int j = i - 1; j >= low; j--) { a[j + 1] = a[j]; } // 如果记录值当前位置,就是合适位置则不操作 if (low != i) { a[low] = temp; } } 总结 从未排好的序列中拿出首元素,并把它赋值给temp变量; 从排好的序列中,依次与temp进行比较,如果元素比temp大

二分法插入排序

半世苍凉 提交于 2020-03-06 21:47:22
二分法插入排序 算法思想简单描写叙述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,假设小,则对前半再进行折半,否则对后半 进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 的全部元素后移,再把第i个元素放在目标位置上。 二分法没有排序,仅仅有查找。所以当找到要插入的位置时。移动必须从最后一个记录開始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。 二分插入排序是稳定的,平均时间O(n 2 ) void binsort( ref int [] data1) 1 、二分法查找插入位置   假设 R[i]<R[m] 成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。重复查找,直到左指针大于右指针时停止。 2 、后移,有点迷惑,什么时候须要后移呢?有哪些记录须要移动呢?   尽管我们非常清楚的知道,我们须要后移那些排序码大于 R[i] 的记录,但难免会问自己这样几个问题。事实上它相当于须要移动从 i-1 到左指针的记录。 3 、插入   由 1 中得到的左指针事实上就是元素要插入的位置。 4 、算法 { int left,right,num; int middle,j; for ( int i = 1;i < data1.Length;i++) { // 准备 left = 0;