数据结构之插入排序--直接插入排序

排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。

第一趟比较示图:

算法实现:

    public static void insertsort(int arr[]){
        for(int i = 1;i < arr.length; i ++){
            if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句
                int temp = arr[i];
                int j;
                for(j = i-1; j >= 0 && arr[j] > temp; j --){
                        arr[j+1] = arr[j];//把比temp大的元素全部往后移动一个位置
                }
                arr[j+1] = temp;//把待排序的元素temp插入腾出位置的(j+1)
            }
        }

    }

    public static void main(String[] args) {
        int array[] = {4,2,1,5};

        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }

        insertsort(array);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
    }
}

结果:

排序之前:
4 2 1 5
排序之后:
1 2 4 5 

算法分析:1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数(Mmin)达到                  最小值。

Cmin = n-1    Mmin = 0;

此时时间复杂度为O(n)。

2.当元素的初始序列为反序时,每趟排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移(arr[j+1] = arr[j]),i个元素后移移动次数当然也就为i                    了,再加上temp = arr[i]与arr[j+1] = temp的两次移动,每趟移动的次数为i+2,此时比较次数(Cmin)和移动次数(Mmin)达到最小值。

Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)

Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2)  (i取值范围1~n-1)

此时时间复杂度为O(n2)。

3.在直接插入排序中只使用了i,j,temp这3个辅助元素,与问题规模无关,所以空间复杂度为O(1).

4.在整个排序结束后,即使有相同元素它们的相对位置也没有发生变化,

如:5,3,2,3排序过程如下

A--3,5,2,3

B--2,3,5,3

C--2,3,3,5

排序结束后两个元素3的相对位置没有发生改变,所以直接插入排序是一种稳定排序。

时间: 2024-11-06 09:36:59

数据结构之插入排序--直接插入排序的相关文章

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

数据结构的故事之插入排序

好久没写点什么了,最近很多企业都在招实习生,周围很多人也都开始到处投简历找实习了,搞的我们人心惶惶的,压力好大.尤其最近互联网好像很火的样子,作为传统通信行业的烟酒僧们,也都放弃了自己的老本行,开始投向了软开的队伍. 只可惜我们学的是<信号与系统>.<通信原理>这种底层的理论的通信课程,虽然看起来高大上,其实也就莫过于调制解调编码解码了.虽然也是从大一就开始学C语言,但是跟计算机比起来,无论各方面都相差甚远.说多了都是泪啊!!还是拿起数据结构踏踏实实地打好基础吧! 排序是数据结构里

【数据结构与算法】—— 插入排序

插入排序(Insertion sort)是一种简单直观且稳定的排序算法.如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间

排序算法:插入排序,折中插入排序

1??插入排序:把序列分为有序和无序两部分排序,如果是升序,则无序和有序比较小则有序右移直到找到大于有序值然后替换,大于则不变,有序++:继续比较: 主要用途:直接插入算法实现简单,在序列基本有序的情况下,移动和比较的次数少,所以有序情况下优先插入排序 复杂度与稳定度:属于稳定的排序方法,时间复杂度 O(n^2) 空间复杂度 O(1); C/C++: 1 #include <iostream> 2 3 int *InsertSort(int *Array, int size) 4 { 5 if

插入排序(直接插入排序、折半插入排序)

一.直接插入排序 package algorithm.sort.compare.insert; import java.util.Arrays; public class DirectInsertSort { public static void main(String[] args) { int[] arrayA = new int[] {11, 213, 134, 65, 77, 78, 23, 43}; directInsertSort (arrayA); System.out.print

插入排序-直接插入排序、希尔排序

插入排序是一类借助'插入'进行排序的算法,主要思想:每次将一个待排序的记录按其关键码大小插入到一个已经排好序的有序序列中,直到全部记录排好序. 一.直接插入排序 直接插入排序是插入排序最简单的算法,类似于玩纸牌时整理手中纸牌的过程.基本思想:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好.代码如下: 1 /*插入排序*/ 2 function sort(arr) { 3 var len=arr.length,temp=0,i,j; 4 arr.unshift(te

数据结构与算法——直接插入排序

好久没写博客了,今天就简单总结下直接插入排序. 什么是直接插入排序? 直接插入排序就是将某一个元素与顺序表中元素进行比较,然后插入到相应的位置,使整个顺序表处于有序状态.有关数据结构的书上都会用扑克牌进行比喻说明,就跟玩扑克一样,当我们拿到几张牌时,要想整理成一个顺子,我们通常的做法就是将小的牌,插到比他大的牌的前面.具体可以看看书,想一想,还是很容易理解的. 直接插入排序的思路:每次将一个待排序的元素按照其关键码的大小插入到一个已经排好序的有序序列中. 直接插入排序有两个基本问题: 如何构造一

数据结构学习之直接插入排序

转自:http://blog.csdn.net/m13666368773/article/details/7506678 看这张图不知道大家可否理解了,在插入排序中,数组会被划分为两种,“有序数组块”和“无序数组块”,第一遍的时候从“无序数组块”中提取一个数20作为有序数组块:第二遍的时候从”无序数组块“中提取一个数60有序的放到”有序数组块中“,也就是20,60:第三遍的时候同理,不同的是发现10比有序数组的值都小,因此20,60位置后移,腾出一个位置让10插入,然后按照这种规律就可以全部插入

数据结构之插入排序--折半插入排序

排序思路:通过折半查找的方式找到合适的插入位置再插入. 算法实现: public class BiInsertSort { public static void biInsertSort(int arr[]){ for(int i = 1; i < arr.length; i ++){ int temp = arr[i]; int left = 0; int right = i-1; while(left <= right){//通过拆装查找找到插入位置 int mid = (left+rig