插入排序

【算法学习】插入排序

怎甘沉沦 提交于 2020-01-20 00:48:53
算法介绍: 插入排序(Insertion sort)是一种简单直观且稳定的排序算法 。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法 ,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度 为O(n^2)。是稳定的排序方法。 算法思想: 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 算法描述: 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 算法演示: 算法分析: 插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 代码示例: function insertionSort(arr) { var len = arr

冒泡排序、插入排序、快速排序

Deadly 提交于 2020-01-18 01:56:24
一、冒泡排序 #include<iostream> using namespace std; void bubble_sort(int a[],int len) { int i,j,temp; int exchange=0; for(i=0;i<len;i++) { exchange=0; for(j=1;j<=len-i-1;j++) if(a[j-1]<a[j]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; exchange=1; } if(exchange!=1) return; } } int main() { int a[]={7,3,5,8,9,1,2,4,6}; bubble_sort(a,9); for(int i=0;i<9;i++) cout<<a[i]<<" " ; return 0; } 二、插入排序 #include<iostream> using namespace std; void insert_sort(int a[],int n) { int i=0,j=0,temp=0; for(i=1;i<n;i++) { temp=a[i]; for(j=i-1;temp<a[j]&&j>=0;j--) a[j+1]=a[j]; a[j+1]=temp; } } int main() { int a[]={7,3,5,8

常用的十大排序算法,经典图解版,『精』!!!

倾然丶 夕夏残阳落幕 提交于 2020-01-16 08:33:26
前言 本文或许是东半球分析十大排序算法最好的一篇文章,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。 预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。 No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的

排序:插入排序及希尔排序

天涯浪子 提交于 2020-01-16 00:27:50
代码 #include < stdio.h > #define SIZE 11 void showarr( int [], int ); void insertsort( int [], int ); void insertsortV2( int [], int ); void shellsort( int [], int ); int main( void ){ int arr[SIZE] = { 0 , 10 , 4 , 7 , 2 , 1 , 8 , 32 , 20 , 80 , 6 }; // insertsortV2(arr,SIZE); // showarr(arr,SIZE); shellsort(arr,SIZE); return 0 ; } void showarr( int arr[], int size){ int i; for (i = 1 ;i < size;i ++ ){ printf( " %d, " ,arr[i]); if (i == size - 1 ){ printf( " \n " ); } } } void shellsort( int arr[], int size){ int n,i,j; printf( " please input n:\n " ); while (scanf( " %d " , & n) == 1 ){ if (

Code_01_InsertionSort 插入排序

两盒软妹~` 提交于 2020-01-15 14:55:13
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。 稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。 在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 —来自百度百科 1897312 比如7 先和9比 再和8比 再和1比 大于1 小于8的 插入到1和8之间 这个过程是j– part1 插入排序思想 //插入排序的代码 public static void insertionSort ( int [ ] arr ) { //又忘了,做判断呀 if (arr == null || arr . length < 2 ) { return ; } for ( i = 0 ; i < arr .

第10章 折半插入排序

你。 提交于 2020-01-14 14:57:14
示例:设有一组关键字 30, 13, 70, 85, 39, 42, 6, 20,采用折半插入排序方法排序的过程如图10-2所示。 完整代码如下: # include <stdio.h> # define TRUE 1 //真 # define FALSE 0 //假 # define OK 1 //通过 # define ERROR 0 //错误 # define MAXSIZE 20 //用作示例的顺序表的最大长度 # define LT(a,b) ((a)<(b)) # define LQ(a,b) ((a)<=(b)) typedef int Status ; /* 记录类型 */ typedef int KeyType ; //定义关键字类型为整数类型 typedef struct //顺序表结构 { KeyType key ; //关键字项 //使用结构体便于使用中扩展 } RcdType ; /* 顺序表类型 */ typedef struct { RcdType r [ MAXSIZE + 1 ] ; //r[0]闲置或用作哨兵单元 int length ; //顺序表长度 } SqList_sort ; //1.创建一个任意顺序的序列。 Status CreateSortList ( SqList_sort * L ) { printf ( "请输入元素个数:"

排序算法——希尔排序

社会主义新天地 提交于 2020-01-13 07:11:33
希尔排序 我对希尔排序进行学习的博客: 希尔排序–简单易懂图解 前言 可以说是一个加强版的插入排序。在插入排序中,最好的时间复杂度是 O ( N ) O(N) O ( N ) 可以说是极其舒服的线性时间复杂度,而这最好的情况,就是当数组中所有的数都是有序的时候,这是 O ( N ) O(N) O ( N ) 的复杂度。或者稍微比较好的情况,就是数组中大部分数都是有序的时候,那么,插入排序的时间复杂度,将趋近于 O ( N ) O(N) O ( N ) ,也就是线性的复杂度。而希尔排序的思想本质就是让数组中的数在尽可能少的次数内,变得有序起来,从而缩短整体时间复杂度,当然这思想没有脱离插入排序的基本做法,所以希尔排序的最坏时间复杂度,依然是 O ( N 2 ) O(N^2) O ( N 2 ) ,但在平均的情况下,希尔排序的时间复杂度将会是挺可观的。 基本做法 对数组进行分组(逻辑上的分组),然后对每个分组进行插入排序,使分组中的数变得有序,因为被分组后,每个分组中的数都不是很多,所以单次分组后的插入排序相对来说不会有过高的时间复杂度。然后经过多次分组然后执行插入排序后,数组中的数在整体上的有序程度会逐步拔高,直到最后一次对整体的插入排序,时间复杂度基本趋近于线性 O ( N ) O(N) O ( N ) 。而这个分组的依据就很关键了,在希尔排序中使用的则是与计算机紧密相关的数 2

插入排序(Java)

陌路散爱 提交于 2020-01-12 13:58:18
简介 将一个记录插入到已排好序的序列中,从而得到一个新的有序序列(将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序) 代码 package nono . sort ; import java . util . Arrays ; /** * 插入排序 * * @author Nonoas * */ public class InsertSorter { public static void insertSort ( int [ ] arr ) { for ( int i = 1 ; i < arr . length ; i ++ ) // 从第二个数开始向前比较 for ( int j = i - 1 ; j >= 0 ; j -- ) if ( arr [ j ] < arr [ i ] ) { //找到第一个比它小的,插入其后面 insert ( arr , i , j + 1 ) ; break ; } else if ( j == 0 ) //如果没有找到比它小的,则插到最前面 insert ( arr , i , 0 ) ; } public static void insert ( int [ ] arr , int from , int to ) { int tmp = arr [ from ] ; for

C++ 希尔排序

我只是一个虾纸丫 提交于 2020-01-11 00:14:37
两个49在排序前后位置颠倒了,所以希尔排序是不稳定的 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 希尔排序的基本思想是: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 设计思路: 1.首先用一个增量来分组,控制增量为一层循环 2.然后控制分组为1层循环,假如增量一开始为5,则分组为:第一组:0 5 15…第二组:1 6 11… 3.直接插入排序 注意这里是对这些分组进行直接插入排序 最后增量为1,就是对整个序列进行直接插入排序 # include <iostream> using namespace std ; //希尔排序 void shellSort ( int arrs [ ] , int len ) { for ( int d = len / 2 ; d >= 1 ; d = d / 2 ) { //控制增量 for ( int k = 0 ; k < d ; k ++ ) { //控制分组 for ( int i = k + d ; i < len ; i = i + d ) { //直接插入排序 //直接插入排序

插入排序

你说的曾经没有我的故事 提交于 2020-01-10 16:13:13
插入排序是一种适用于 少数量的排序算法 ,在排序元素量级不是很大的情况(比如千以下),是比较好的选择。 插入排序的思想: 对于待排序的一个序列,默认序列第一个元素是 完成排序的序列 。 依次取出 未排序序列 中的一个元素 a 对于 完成排序的序列 ,从后向前扫描,并将扫描的元素 b 和a比较( 比较过程 ) 若 未排序序列 中的 元素a 小于 完成排序的序列 中的 元素b ,则将元素a向后移动,给元素b腾位置;反之,则继续扫描 完成排序的序列 重复2,3,4步骤,即可完成排序 插入排序GIF演示图 插入排序参考代码(C++): void insertion_sort ( int arr [ ] , int len ) { //依次取出未排序序列中的元素 for ( int i = 1 ; i < len ; i ++ ) { int temp = arr [ i ] ; //当前等待排序的元素 //比较过程,从后向前扫描已排好序的部分,并将扫描的元素和待排序元素比较 for ( int j = i - 1 ; j >= 0 ; j -- ) { //交换过程,当前元素大于temp的话,则把当前元素往后移,给temp腾位置 if ( arr [ j ] > temp ) { arr [ j + 1 ] = arr [ j ] ; arr [ j ] = temp ; } else {