`
diaoaa
  • 浏览: 18636 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

插入排序算法

 
阅读更多
插入排序是简单排序的一种,也是基于“减治法”思想的一种算法,减治法有3种变形:
  • 减去一个常量;
  • 减去一个常量因子;
  • 减去的规模是可变的。
插入排序算法的时间复杂度和冒泡、选择排序算法一样也是o(n²),常见的基于插入排序算法思想的排序算法有:
  • 直接插入排序算法;
  • 折半插入排序算法;
  • 希尔排序算法。(查看
插入的方法一共有三种:
  • 我们可以从左向右扫描序列,找到合适的位置插入;
  • 我们可以从右向左扫描序列,找到合适的位置插入;
  • 对于有序序列我们可以使用折半查找到合适的位置插入。
对于未知是否有序的数组,我们一般采用第二种方法从后往前扫描,它可以在比较的过程中往后移动腾空位置比第一种要少做一次循环,效率比同种情况下的从前往后扫描更高,这一点可以去验证一下。

一、直接插入排序算法:
1、描述:假定在有序数组A[0...n-2]后面插入一个元素An-1,也就是把A[n-1]位置的移动到它合适的位置去,可以从后往前扫描,直到遇到第一个小于等于它的元素,然后把它插入到该元素的后面。
2、C语言代码实现
#include <stdio.h>

void directlyinsertSort(int a[],int n);

int main()
{
    int a[] = {6,3,8,7,3,0,9,-3,15,4};
    int k = 0;
    directlyinsertSort(a,10);
    for(;k<10;k++)
    {
        printf("%4d",a[k]);
    }
    return 0;
}

void directlyinsertSort(int a[],int n)
{
    int temp = 0;
    int i,j;
    for(i=1;i<n;i++)
    {
        if(a[i]<a[i-1])
        {
            temp = a[i];
            j = i;
            do{
                a[j] = a[j-1];
                j--;
            }while(j>0&&a[j-1]>temp);
            a[j] = temp;
        }
    }
}
3、Java代码实现
public static void insertSort0405(int[] a){
		int temp;
		int j;
		for(int i=1;i<a.length;i++){
			if(a[i]<a[i-1]){
				temp = a[i];
				j = i;
				do{
					a[j] = a[j-1];
					j--;
				}while(j>0&&a[j-1]>temp);
				a[j] = temp;
			}
		}
	}
4、一点优化
上述代码中使用了temp变量临时存放需要插入的元素,这样在while比较语句中(j>0&&a[j-1]>temp)就需要判断两次,对于庞大的数据量,这样做消耗非常大,于是我们可以使用a[0]的位置来充当这个临时存放,改进的代码如下:
#include <stdio.h>

void optimizeDirectlyInsertSort(int a[],int n);

int main()
{
    int a[] = {0,6,3,8,7,3,0,9,-3,15,4};
    int k = 0;
    optimizeDirectlyInsertSort(a,10);
    for(k=1;k<=10;k++)
    {
        printf("%4d",a[k]);
    }
    return 0;
}

void optimizeDirectlyInsertSort(int a[],int n)
{
    int i,j;
    for(i=2;i<=n;i++)
    {
        if(a[i]<a[i-1])
        {
            a[0] = a[i];
            j = i-1;
            do{
                a[j+1] = a[j];
                j--;
            }while(a[0]<a[j]);
            a[j+1] = a[0];
        }
    }
}

二、折半插入排序算法
1、描述:折半插入排序算法的使用是有前提的,就是必须是有序数组。它是指在一个有序序列中插入一个元素形成一个心得有序序列。在有序序列中进行查找,折半思想也是最有效的方法。折半查找设置三个下标low、high和mid,设置low的值为1,high为n-1,mid的值为(low+high)/2,然后将要插入的元素与mid下标元素进行比较。若小于mid下标元素,那么high=mid-1,low值不变,若大于mid下标元素,则low=mid+1,high值不变;若等于mid那么查找成功插入之。
2、C语言代码实现
#include <stdio.h>

void halfInsertSort(int a[],int n);

int main()
{
    int a[] = {0,1,2,3,4,6,7,8,9,10,5};
    int k = 0;
    halfInsertSort(a,10);
    for(k=1;k<=10;k++)
    {
        printf("%4d",a[k]);
    }
    return 0;
}

void halfInsertSort(int a[],int n)
{
    int low,mid,high;
    int i,j,m;
    for(i=2;i<=n;i++)
    {
        a[0] = a[i];
        low = 1;
        high = i -1;
        while(low<=high)
        {
            m = (low+high)/2;
            if(a[0]<a[m])
            {
                high = m -1;
            }else low = m + 1;
        }
        for(j=i-1;j>=high;j--)
        {
            a[j+1] = a[j];
        }
        a[high+1] = a[0];
    }
}


分享到:
评论

相关推荐

    C语言_插入排序法和冒泡排序法

    - **插入排序**:同样也是稳定的排序算法,相等元素的相对位置不会改变。 ### 四、应用场景 - **冒泡排序**:适用于小规模数据或者几乎已经排序的数据。 - **插入排序**:适用于小规模数据,或者是数据已经部分...

    Java直接插入排序算法源码

    总的来说,Java中的直接插入排序算法是一个直观易懂的排序方法,虽然在效率上不敌更高级的排序算法,但它在理解和实现上相对简单,对于初学者来说是很好的学习材料。通过阅读和实践这个源代码,你可以深入理解排序...

    插入排序算法c++实现

    综上所述,"插入排序算法c++实现"涉及到C++基础语法、数组与指针操作、循环和条件控制、排序算法原理、性能分析以及良好的编程习惯等多个方面。通过实践这个项目,开发者不仅可以深入理解插入排序算法,还能提升C++...

    直接插入排序法

    直接插入排序法~~~~~内部排序

    使用C语言写的直接插入排序算法

    ### 使用C语言实现的直接插入排序算法 #### 算法概述 本篇文章将详细介绍一个使用C语言编写的直接插入排序算法。直接插入排序是一种简单的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序...

    希尔排序,直接插入排序,折半插入排序算法.

    综上所述,希尔排序、直接插入排序和折半插入排序都是常见的排序算法。它们各有特点,适用于不同场景下的数据排序需求。希尔排序通过增加子序列的插入排序来提高效率;直接插入排序简单直观,但效率较低;而折半插入...

    插入排序法JAVA代码

    以下是一个简单的Java插入排序算法实现: ```java public class InsertionSort { public static void insertionSort(int[] array) { for (int i = 1; i ; i++) { int key = array[i]; int j = i - 1; // 将比...

    C语言实现的插入排序

    在这个示例中,`insertion_sort`函数实现了插入排序算法,`print_array`函数用于打印数组。主函数`main`中,我们创建了一个数组并调用`insertion_sort`对其进行排序,最后打印排序结果。 插入排序的时间复杂度在...

    插入排序法

    在压缩包中的"插入排序法"可能包含了一个或多个实现插入排序的C++源文件,用于演示和练习如何在实际编程中应用这个算法。通过阅读和运行这些代码,你可以更深入地理解插入排序的运作机制,并提升编程能力。

    c语言 插入排序法

    c语言基本插入排序法c语言基本插入排序法c语言基本插入排序法c语言基本插入排序法

    亂數用插入排序法 C++

    本主题聚焦于“亂數用插入排序法”,即使用插入排序算法对随机生成的数字序列进行排序。插入排序是一种简单直观的排序算法,适用于小规模或部分有序的数据集。以下是关于“亂數用插入排序法”的详细解释。 插入排序...

    插入排序算法C语言程序.zip

    总的来说,这个"插入排序算法C语言程序"项目提供了一个实践插入排序算法的机会,可以帮助开发者加深对排序算法的理解,尤其是在C语言环境下如何实现和优化排序算法。通过分析和运行代码,可以更好地掌握插入排序的...

    数据结构 直接插入排序的算法源程序

    ### 数据结构:直接插入排序算法解析 #### 一、引言 在计算机科学领域,排序是一种常见的操作,用于将一组无序的数据按照特定的顺序排列。插入排序是一种简单直观的排序算法,它的工作原理类似于人们手工排序扑克...

    zhijiecharupaixu.rar_插入排序_插入排序算法

    这个压缩包“zhijiecharupaixu.rar”包含的资源是关于直接插入排序算法的实现和相关资料。 直接插入排序的基本思想是:假设数组中有n个元素,已知前i个元素是有序的,现在要把第i+1个元素插入到已排序的序列中,使...

    冒泡,选择,插入排序算法c语言实现

    冒泡排序算法选择排序算法插入排序c语言实现

    经典插入排序算法(c/c++语言)

    插入排序是一种基础且重要的排序算法,它的工作原理类似于人们整理扑克牌的过程。在这个教程中,我们将深入探讨插入排序在C/C++语言中的实现,并理解其背后的逻辑和效率。 ### 插入排序概述 插入排序是一种简单直观...

    堆排序与直接插入排序算法的比较

    堆排序与直接插入排序算法的比较 堆排序和直接插入排序是两种常用的排序算法,分别具有不同的时间和空间复杂度。本文将通过对两种排序算法的实现和比较,分析它们的优缺点,并讨论在不同场景下的应用。 1.1 功能...

    C#实现插入排序算法

    本文将深入探讨C#语言中实现插入排序算法的方法,以及其在升序和降序排序中的应用。 插入排序是一种简单直观的排序算法,它的基本思想是将待排序的数据元素看作是一个有序序列,每次将一个待排序的记录,按其关键字...

    c语言中的插入排序法PPT课件.pptx

    插入排序法是一种简单的排序算法,它通过比较待排序元素与已排序元素的大小,插入到合适的位置,以达到排序的目的。插入排序法的时间复杂度为O(n^2),空间复杂度为O(1)。 知识点二:插入排序法的实现步骤 插入排序...

    插入排序算法(动态数组实现)

    插入排序算法(动态数组实现) printf("--------插入排序算法的实现--------\n"); printf("输入数组的大小length:\n"); int length=0; scanf("%d",&length); /****动态分配内存初始化数组*********************...

Global site tag (gtag.js) - Google Analytics