常见算法之排序算法二【插入排序】

什么是插入排序!简单的介绍一下它的思想(假设为升序):在已经排好序的数组内,插入新的元素,从后往前找,当找到某个比它小的数,则停止,并将它插入这个与上一个数之间。先给大家看个图:

具体算法描述如下:

1.从第一个元素开始,因为只有一个元素,所以它有序。

2.拿它后面的一个元素和它进行比较。

3.它后面的元素比它大,把他往后移,并把它后面的元素赋给它原来的位置。

4.重复3的动作,直到找到比它小或者相等的元素,将该元素插入到比它小的元素后面

5.重复2~5的操作

我们先来看看代码:

<span style="font-size:14px;">   public static void sort(int[] array){
        for (int i = 1; i < array.length; i++){
            int j = i - 1;
            int temp = array[i];
            while((j >= 0) && (array[j] > temp)){
                array[j + 1] = array[j];
                j--;
            }
            array[j+1] = temp;
        }
    }</span>

比较简洁,也许你会说可以从前往后比较吗,我会说可以,但是,为了分清楚是跳出循环的是遍历到最后一个还是找到第一个比它的数,还是第一个数就是比它大,我们需要引入一个标志位,具体如下:

    private static void move(int[] array, int from, int to){
        for(int i = to; i > from; i--){
            array[i] = array[i - 1];
        }
    }

    public static void sort1(int[] array){
        for(int i = 1; i < array.length; i++) {
            int j = 0;
            boolean flag = false;
            while(!flag && (j < i)){
                if (array[i] < array[j]) {
                    flag = true;
                }
                j++;
            }

            if ((flag)) {
                int temp = array[i];
                move(array, --j, i);
                array[j] = temp;
            }
        }
    }

看起来就比上面复杂多了,所以还是推荐从后往前比较。

可以很轻易的得到,时间复杂度是O(n^2)的,空间复杂度是O(n) + O(1),最优时间复杂度为O(n).

时间: 2024-10-10 00:44:02

常见算法之排序算法二【插入排序】的相关文章

数据结构常见的八大排序算法(详细整理)

https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法.常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 性能比较.png 下面,利用Python分别将他

数据结构——常见的十种排序算法

一.常见的十种排序算法: 冒泡排序.选择排序.插入排序.归并排序.快速排序.希尔排序.堆排序.计数排序.桶排序.基数排序 1.[知识框架] 补充:内部排序:整个排序过程完全在内存中进行. 外部排序:由于待排序记录数据量太大,内存无法容纳全部数据,需要借助外部存储. 二.排序方法 ?插入排序 1.算法思想 从待排序的第二个元素开始,向下扫描列表,比较这个目标值target与arr[i-1].arr[i-2]的大小,依次类推.如果target的值小于或等于每一个元素值,那么每个元素都会向右滑动一个位

算法学习-排序算法

数据结构-算法复杂度 时间复杂度 事件频度 一个算法花费的时间与算法种语句的执行次数成正比,哪个算法种语句执行次数多,它花费时间就多. 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n) eg:计算1-100的和 方法一:for循环 T(n) = n + 1 方法二:直接计算 T(n) = 1 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数时问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于0的常

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排

算法之排序算法总结

算法之排序算法总结 | Carrie博客 全部 全部 博客 友链 关于 ps:这里的排序都是从小到大进行排列. 冒泡排序 算法思想:从第一个数开始,将两个相邻的数进行比较,如果前一个数大于后一个数,则互换位置,否则保持不变.这样比较一趟,可以把最大的数放在末尾(根据循环的趟数决定).依次循环,直到排序完成. 时间复杂度:O(n^2) 大专栏  算法之排序算法总结li>空间复杂度:O(1) 选择排序 算法思想:从待排序的数字中找出最小的数,放在排序数字的最开始,之后依次在未排序的数字中选出最小的数

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

STL算法之排序算法

STL排序算法通常复杂度坏于线性,且必须要random-access Iterators. 所以,forward_list, list, associative and unordered contains 不提供随机访问迭代器,这些容器不能用排序算法. 但是,forward_list,list提供了成员函数sort,associative contains 自动排序,unordered contains不能排序. 通常,排序元素一次要比保持元素有序要更快.STL提供了不同的排序算法,根据需求选

c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值,覆盖给定的范围的元素 fill_n 用给定值,覆盖给定开始位置后的,n个元素变 back_inserter 在容器末尾插入元素 copy 把容器1指定范围里的值拷贝给容器2,并返回指向容器2最后一个元素的下个元素 replace 用某个值替换掉给定范围的某个值 replace_copy 用某个值替

常见的比较排序算法

比较排序是比较常见的排序算法,它分为以下几个类: 交换排序:冒泡排序(BubbleSort)和快速排序(QuickSort). 插入排序:直接插入排序和希尔排序(ShellSort). 选择排序:选择排序(SelectSort)和堆排序(HeapSort). (一)交换排序: void BubbleSort(int* arry, int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; 

常见的七大排序算法Java实现

/** * @author Javen * @Email [email protected] * 2015年12月9日 */ public class Sorting { static int[] array = new int[]{11, 31, 12, 5, 34, 30, 26, 38, 36, 18}; public static void main(String[] args) { //插入排序 System.out.println(array2String(sortInsert(ar