详解直接插入排序

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

第一种程序:

  1. void InsertSort1(int arr[] , int n)
  2. {
  3. for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
  4. {
  5. int temp=arr[i];//temp标记为未排序第一个元素
  6. int j=i-1;
  7. while (j>=0 && arr[j]>temp)//将temp与已排序元素从大到小比较,寻找temp应插入的位
  8. {
  9. arr[j+1]=arr[j];    //比temp大则向后移动
  10. j--;
  11. }
  12. arr[j+1]=temp;
  13. }
  14. }

第二种程序:将搜索和数据后移这二个步骤合并.

  1. void Insertsort2(int a[], int n)
  2. {
  3. int i, j;
  4. for (i = 1; i < n; i++)
  5. if (a[i] < a[i - 1])
  6. {
  7. int temp = a[i];
  8. for (j = i - 1; j >= 0 && a[j] > temp; j--)
  9. a[j + 1] = a[j];
  10. a[j + 1] = temp;
  11. }
  12. }

第三种程序:用数据交换代替数据后移。

  1. void Insertsort3(int a[], int n)
  2. {
  3. int i, j;
  4. for (i = 1; i < n; i++)
  5. for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
  6. Swap(a[j], a[j + 1]);
  7. }

第三种数据无序厉害的话,由于要交换多次,所以第三种相对于前两种来说效率差点。

但 第三种算法没有temp这个临时变量,在某些极端的情况下,对内存需要特别严格的时候需要这样的。

时间: 2024-10-10 13:04:04

详解直接插入排序的相关文章

POJ-1007: DNA Sorting 详解1: 插入排序法

> 分析 >> 本题分两步 1. 计算序列的逆序数 2. 根据逆序数排序 >> 由于序列个数最大只有100个, 所以不需要过分追求速度,插入排序就够用 > 注意: >> 存储序列的数组长度最好是50+1, 有利于输出 > 附代码 1 #include "stdio.h" 2 3 int main(void) 4 { 5 char seqs[100][50 + 1] = {0} ; 6 int inversions[100] = {0

(转)详解八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

20160206.CCPP体系详解(0016天)

代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地址操作符(&)详解: // 1.操作对象:变量名(实质:内存实体|数据实体) // 2.操作特点:属于寄存器操作(操作结果不是内存实体) // (1).取地址操作(&变量名)是在CPU的寄存器区域所完成的操作; // (2).地址数据不占用内存,内存地址是在CPU核心构成组件寄存器产生的, /

javascript常用经典算法实例详解

javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与使用技巧,需要的朋友可以参考下 本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld ? 1 2 3 4 5 6 7 8 9 10 //线性搜索(入门HelloWorld) //A为数组,x为要

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,

详解四大排序算法

作者: Dsir 分类: PHP 发布时间: 2017年08月04日 07时40分 详解四大排序算法 如何排序? NBA总决赛正在如火如荼的进行,老詹也正朝着他的第5个总亚军前进着.假设骑士队队员在运动场上排列成一队,如图所示,所有队员已经站好,准备热身,现在需要按身高从低到高 为队员们排队(最矮的站在左边),给他们照一张集体照,应该怎么排队呢? 在排序这件事情上,人与计算机程序相比有以下优势:我可以同时看到所有的队员,并且可以立刻找出最高的一个,毫不费力得测量和比较每一个人的身高.而且队员们不

快速排序算法详解与实现

快速排序是一种分治排序算法.广泛认为它是解决一般问题的最佳排序算法.同插入排序一样,快速排序也属于比较排序的一种,而且不需要额外的存储空间.在处理中到大型数据集时,快速排序是一个比较好的选择. 由于快速排序是一种分治算法,因此可以用分治法的思想将排序分为三个步骤 1.分:设定一个分割值将数据分为两部分. 2.治:分别在两部分用递归的方式继续使用快速排序法. 3.合:对分割部分排序排序直至完成. 实现代码如下: import java.util.Random; /** * 快速排序 {分,治,合}

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都