前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >直接插入排序

直接插入排序

作者头像
用户1154259
发布于 2018-01-17 11:12:02
发布于 2018-01-17 11:12:02
50900
代码可运行
举报
运行总次数:0
代码可运行

时间复杂度:

如果排序的数组是正序的,那么时间复杂度相当于O(n),

而如果排序是随机的,时间复杂度相当于O(n^2/4).

倒置的时间复杂度是最高的,O(n^2).

算法思想:

  该算法是设置了一个中间存储,每次读到的数据存储到中间值。向前遍历,如果大于这个值,继续向前,每次向前遍历时,把数据向后移,最后空出的位置,就是他本身应该在的位置。因此,如果是一个正序的数组,就不会出现移动的情况,时间复杂度也就降低了。

主要代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void straightInsert(int *arr,int length){
    int i,j,k;
    for(i=1;i<length;i++){
        if(arr[i] < arr[i-1]){
            k = arr[i]; //作为中间值存储每次的记录值
            for(j=i-1;arr[j] > k;j--){ //把大于该值的元素都向后移
                arr[j+1] = arr[j];
            }
            arr[j+1] = k;
        }
    }
}

全部代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5};
int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9};
int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0};
void copy(int *from,int *arr,int length);
void print(int *arr,int length);
void straightInsert(int *arr,int length);
int main(){
    clock_t start,end;
    int Arr[10];
    int i;
    start = clock();
    for(i=0;i<100000;i++){
        copy(arrtest1,Arr,10);
        //print(Arr,10);
        straightInsert(Arr,10);
        //print(Arr,10);
    }
    end = clock();
    printf("first test:%d\n",end-start);

    start = clock();
    for(i=0;i<100000;i++){
        copy(arrtest2,Arr,10);
        //print(Arr,10);
        straightInsert(Arr,10);
        //print(Arr,10);
    }
    end = clock();
    printf("first test:%d\n",end-start);

    start = clock();
    for(i=0;i<100000;i++){
        copy(arrtest3,Arr,10);
        //print(Arr,10);
        straightInsert(Arr,10);
        //print(Arr,10);
    }
    end = clock();
    printf("first test:%d\n",end-start);

    getchar();
    return 0;
}
void straightInsert(int *arr,int length){
    int i,j,k;
    for(i=1;i<length;i++){
        if(arr[i] < arr[i-1]){
            k = arr[i]; //作为中间值存储每次的记录值
            for(j=i-1;arr[j] > k;j--){ //把大于该值的元素都向后移
                arr[j+1] = arr[j];
            }
            arr[j+1] = k;
        }
    }
}
void copy(int *from,int *arr,int length){
    int i;
    for(i=0;i<length;i++){
        arr[i] = from[i];
    }
}

void print(int *arr,int length){
    int i;
    for(i=0;i<length;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
}

运行示例:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-04-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
希尔排序
希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。 算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。 主要程序: void shellSort(int *arr,int length){ int i,j,k; int increment = length; while(increment>0){ if(incremen
用户1154259
2018/01/17
4410
希尔排序
冒泡排序
冒泡排序时间复杂度上为O(n^2) 冒泡排序三种方式,第一种也是最基本的排序: void bubbleSort1(int *arr,int length){ int i,j,k; for(i=0;i<length;i++){ for(j=i+1;j<length;j++){ if(arr[i]>arr[j]){ k = arr[j]; arr[j] = arr[i];
用户1154259
2018/01/17
6060
冒泡排序
直接插入排序
算法思想 把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 设无序数组为a[0…n-1]。 1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。 2.令i=1,将a[i]插入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3.i++并重复第二步直到i==n-1,排序完成。 ---- 一趟直接插入排序方法 具体做法: 将待插入记录 a[i]的关键字从右向左依次与有序区中记录 aj的关键字进行比较: 1.若 a[j]的
qubianzhong
2019/07/01
4330
排序三 直接插入排序
本文介绍了插入排序算法,通过一个简单的实例,详细讲解了插入排序的基本原理和实现过程。
静默虚空
2018/01/05
5100
排序三 直接插入排序
【数据结构】排序算法---直接插入排序(动图演示)
直接插入排序是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。
Crossoads
2024/10/22
4400
【数据结构】排序算法---直接插入排序(动图演示)
堆排序
构建堆的时间复杂度为O(n),而第I次调整堆的时间复杂度为O(logi),因此,无论什么情况下时间复杂度都为O(nlogn)。 算法思想:   首先,对数组从n/2处开始进行创建堆。大顶堆就是顶点总是大于它的子节点,而小顶堆就是定点总是小于它的子节点。   因此,构建时,对节点与他的孩子进行比较,如果创建的是大顶堆,那么就把最大的孩子跟自己进行比较,比自己大,就进行替换。依次类推。   最后把最顶点的与最后一个元素进行替换,在进行堆的调整,此时的调整,相当于调整最顶点的元素。 主要代码: void heap
用户1154259
2018/01/18
5900
堆排序
7.2.1 直接插入排序
插入排序是一种简单直观的排序方法,其基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列,直到全部记录插入完成。
week
2018/08/27
5080
插入排序—直接插入排序(Straight Insertion Sort)
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止。
瑾诺学长
2018/09/21
9210
插入排序—直接插入排序(Straight Insertion Sort)
八大排序的Java实现概述1. 插入排序—直接插入排序(Straight Insertion Sort)2. 插入排序—希尔排序(Shell`s Sort)4. 选择排序—堆排序(Heap Sort)
概述 排序有内部排序和外部排序 内部排序是数据记录在内存中进行排序 外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 时间复杂度为最差情况下的复杂度 八大排序就是内部排
JavaEdge
2018/05/16
1.5K0
(递归版)合并排序
递归版的合并排序,时间复杂度为O(nlogn),空间复杂度为O(n+logn); 算法思想: 利用分而自治的思想,把排序分成两块,每块内部排序,再进行一次遍历排序即可,递归调用此过程即可。 主要代码: void MergeSort(int *arr,int length){ Msort(arr,arr,0,length-1); } void Msort(int *arr1,int *arr2,int begin,int end){ int arr3[10]; int m;
用户1154259
2018/01/17
8350
(递归版)合并排序
数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现 数据结构图文解析之:
Tencent JCoder
2018/07/02
1.5K0
直接插入排序法——java语言实现
2,6,4,1,5,9, 2,4,6,1,5,9, 1,2,4,6,5,9, 1,2,4,5,6,9, 1,2,4,5,6,9, 最终排序结果: 1,2,4,5,6,9,
MickyInvQ
2020/09/27
3410
数据结构从入门到精通——直接插入排序
直接插入排序是一种简单的排序算法,其工作原理是逐个将待排序元素插入到已排序序列中的适当位置,直到全部元素排序完毕。算法从第二个元素开始,将其与前面的元素进行比较,如果当前元素小于前一个元素,则将其插入到前一个元素之前,否则继续向前比较。重复此过程,直到当前元素找到合适的插入位置。每次插入一个元素后,已排序序列的长度增加1,直到整个序列排序完成。直接插入排序的时间复杂度为O(n^2),在数据量较小时效率较高,但在大规模数据排序中性能不佳。
鲜于言悠
2024/03/24
7760
数据结构从入门到精通——直接插入排序
排序算法之我观
笔者今年是xmu大一新生 9月初学编程 学到泡排的时候就对排序这一块深入了解 (也只是很粗浅地学习了一下) 写这篇文章的初衷就是复习一下之前所学,有不足之处请不吝赐教 所谓排序 就是将杂乱无章的数据变得有规律 这其中有五花八门的算法,时间复杂度相同的算法不一而足 目前笔者只给读者展示几种基础算法 (冒泡排序,选择排序,插入排序,快速排序,基数排序,希尔排序,归并排序) (之所以没有介绍堆排序的原因是笔者也不是很懂这方面,大一上还没学数据结构) 有低效但好用,高效但不好写之类的 1.冒泡排序(Bubble Sort) 相信大家对这个应该也不陌生吧 应该要熟到半分钟就能把模板打出来 具体运作过程如下: 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 分析: 平均时间复杂度:两重循环:o(n^2) 稳定的算法 上代码(笔者目前只学一门c,IDE是cb) 图源:https://blog.csdn.net/qq_39741605/article/details/80821595
glm233
2020/09/28
4150
排序算法之我观
聊聊「插入排序」的正确姿势
面试官最爱考察的是一个被试者对知识掌握的灵活程度和熟练程度,当一道题目可以同时考察到被试者多个知识点的掌握程度和思考能力时,面试官最爱这样的题目,而且对于插入排序这样被大家耳熟能详的知识点,常常成为考点。
五分钟学算法
2020/07/09
7890
聊聊「插入排序」的正确姿势
详解直接插入排序算法
在玩扑克牌的时候,我们抽到一张牌的时候,都是将它插入到当前手中牌的合适位置的。 如下图:
code随笔
2020/04/14
4270
详解直接插入排序算法
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8320
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
直接插入排序 希尔排序
【1 2 3 4  7 8 9】 6 插入3, 3和 9 交换,3和8交换, 3和7交换, 3和4交换
用户2965768
2018/12/28
3950
【Java数据结构和算法】011-排序:冒泡排序、选择排序、插入排序、希尔排序*
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒;
訾博ZiBo
2025/01/06
1170
【Java数据结构和算法】011-排序:冒泡排序、选择排序、插入排序、希尔排序*
插入排序之直接插入排序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
4220
插入排序之直接插入排序
相关推荐
希尔排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档