【Algorithm】插入排序

一. 算法描述

  插入排序具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

  举个例子:5 7 6 4 3 8

  第一趟:5 7 6 4 3 8  =》5 7 6 4 3 8

  第二趟:5 7 6 4 3 8  =》5 6 7 4 3 8

  第三趟:5 6 7 4 3 8  =》4 5 6 7 3 8

  第四趟:4 5 6 7 3 8  =》3 4 5 6 7 8

  第五趟:3 4 5 6 7 8  =》3 4 5 6 7 8

三. 算法实现

  算法实现1

/*
* author:Knife
* time:2014.06.13 16:07
* Algorithm:插入排序(从前向后查找)
*/
#include<stdio.h>
void main_insertSort(){
    int intArr[] = {8,3,6,4,2,9,5,4,1,7};
    int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度
    int i,j,k,tmp;

    for(i = 1; i < n; i++){
        for( j = 0; j < i; j++){
            if(intArr[i] < intArr[j]){ // 插入位置j
                tmp = intArr[i];
                for(k = i; k>j; k--){
                    intArr[k] = intArr[k-1];
                }
                intArr[j] = tmp; // 插入
            }
        }
    }

    // 打印输出
    for(i=0; i<n; i++){
        printf("%d ",intArr[i]);
    }
    printf("\n");
}

  算法实现2

/*
* author:Knife
* time:2014.06.13 16:07
* Algorithm:插入排序(从后向前查找)
*/
#include<stdio.h>
void main_1(){
    int intArr[] = {8,3,6,4,2,9,5,4,1,7};
    int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度
    int i,j,tmp;

    //插入排序
    for(i = 1; i < n; i++){
        tmp = intArr[i];
        j = i-1;
        while(j>=0 && (tmp < intArr[j])){ // 插入位置
            intArr[j+1] = intArr[j];
            j--;
        }
        intArr[j+1] = tmp; // 插入操作
    }

    // 打印输出
    for(i=0; i<n; i++){
        printf("%d ",intArr[i]);
    }
    printf("\n");
}

  算法实现3

#include<stdio.h>
/*
* author:Knife
* time:2014.06.13 16:43
* Algorithm:插入排序(二分查找)
*/
void main(){
    int intArr[] = {8,3,6,4,2,9,5,4,1,7};
    int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度
    int i,j,low,high,mid,temp;

    for(i = 1; i < n; ++i){
        low = 0;
        high = i-1;
        while(low <= high){  //使用二分查找,寻找插入的位置
            mid = low + ((high-low) >> 1);    //这种写法,有效避免溢出
            if(intArr[i] > intArr[mid]){
                low = mid + 1;
            }else{
                high = mid - 1;
            }
        }

        temp = intArr[i];
        for(j = i; j > low; j--){  //移动元素
            intArr[j] = intArr[j-1];
        }

        intArr[low] = temp;  //在合适位置,插入。这里为什么是 low? 得仔细想想(答案在这里http://blog.csdn.net/zhangxiangdavaid/article/details/27373183)!
    }

    // 打印输出
    for(i = 0; i < n; i++){
        printf("%d ",intArr[i]);
    }
    printf("\n");
}

四. 算法分析

  • 平均时间复杂度:O(n^2)
  • 空间复杂度:O(1)  (用于记录需要插入的数据)
  • 稳定性:稳定

参考资料

[1] http://blog.csdn.net/zhangxiangdavaid/article/details/27373183

[2] http://blog.csdn.net/cjf_iceking/article/details/7916194

【Algorithm】插入排序

时间: 2024-10-03 07:44:47

【Algorithm】插入排序的相关文章

插入排序(JAVA)

package org.rev.algorithm; /**  * 插入排序:每次将一个待排序的记录,按其大小插入到前面已经排序的子序列的合适位置,直到全部插入.  *   * 1. 直接插入排序:和已经排序的部分逐一比较找到合适位置  *   * 2. 二分插入排序:使用二分法找到合适的位置  *   * 3. 希尔排序(Shell Sort):分组的直接插入排序  *   */ public class InsertionSort {   public static void main(St

插入排序的优化【不靠谱地讲可以优化到O(nlogn)】 USACO 丑数

首先我们先介绍一下普通的插排,就是我们现在一般写的那种,效率是O(n^2)的. 普通的插排基于的思想就是找位置,然后插入进去,其他在它后面的元素全部后移,下面是普通插排的代码: 1 #include<iostream> 2 #include<fstream> 3 #include<stdio.h> 4 using namespace std; 5 int a[200000]; 6 int p[200000]; 7 8 int main(){ 9 ios::sync_wi

数据结构(DataStructure)与算法(Algorithm)、STL应用

catalogue 0. 引论 1. 数据结构的概念 2. 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 2.3.1 二叉树 3. 物理结构实例 3.1 链表 3.1.1 单向线性链表 3.1.2 单向循环链表 3.1.3 双向线性链表 3.1.4 双向循环链表 3.1.5 数组链表 3.1.6 链表数组 3.1.7 二维链表 3.2 顺序存储 4. 算法 4.1 查找算法 4.2 排序算法 0. 引论 0x1: 为什么要学习数据结构 N.沃思(Niklaus  Wirth)教授提

排序:折半插入排序(时间复杂度 O(nlog2 n) )

排序 Time Limit: 1000MS Memory limit: 32678K 题目描述 给你N(N<=100)个数,请你按照从小到大的顺序输出. 输入 输入数据第一行是一个正整数N,第二行有N个整数. 输出 输出一行,从小到大输出这N个数,中间用空格隔开. 示例输入 5 1 4 3 2 5 示例输出 1 2 3 4 5 #include <math.h> #include <string.h> #include <stdio.h> #include <

插入排序(insert_sort)与 并归排序(merge_sort) 算法分析

(一)插入排序 算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法. 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 算法描述: 一般来说,插入排序都采用in-place在数组上实现.具

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

冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次笔记两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行知道没有在需要的交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. data_set = [ 9,1,22,31,45,3,6,2,11 ] loop_count = 0 for j in range(len(data

插入排序——算法导论

最近在看MIT的算法导论,在网易公开课上有这门课的视频,正好讲义也在图书馆借到了,有在看的小伙伴可以一起加油. 绪论中以插入排序为例,讲述了算法中非常重要的两个概念时间复杂度T(n)和空间复杂度.详细地对程序花费时间T. 伪代码: INSERTION-SORT(A) 1 for j←2 to length[A] 2 do key←A[j] 3 Insert A[j] into the sorted 4 sequence A[1..j-1]. 5 i←j-1 6 while i>0 and A[i

普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity

计算复杂度(Computational complexity):用于研究解决特定问题X的算法效率的框架 计算模型(Model of computation):可允许的操作(Allowable operations) 成本模型(Cost model):操作数(Operation counts) 上界(Upper bound):最多的成本 下界(Lower bound):最少的成本 最优算法(Optimal algorithm):最有可能性的成本的算法(Algorithm with best pos

c2java select algorithm

对于很多应用来说,随机算法是最简单的或者最快的.既简单又快的有没有呢? 那需要深刻的洞察力或者革命性的突破. 什么是随机算法 随机算法与确定算法区别是:它还接收输入随机比特流来做随机决策. 对于同一个输入,每次运行所用的算法行为都不同,虽然结果都是一样的. Foiling an adversary 可以构造一个输入使得一个确定性算法运行时间最长. 随机算法可以看作是从一族算法中随机选出来的一个算法. 快速排序O(NlgN)的精髓在于随机化划分. 快速的意思是常数因子是1.38. 标准库里面采用小