数据结构与算法分析-插入排序

我们先来看一种最简答的排序方法-插入排序,插入排序通过N-1趟(Pass)排序组成,如P代表趟数,那么我们一共要从P=1到P=N-1,每一趟排序,我们可以保证从位置0到位置P-1也就是前P个元素都已经是排好序的。方法就是在第P趟时将位置P上的元素放入前P个元素组成的排序队列中去,使得前P+1个元素继续保持顺序状态,因此问题的关键就是找到P位置上的元素应该插入到排序队列的哪个位置,我们需要遍历前P个元素,把所有比P元素大的元素向右移动(假如我们是从小到大排序),然后把P元素放在空出来的哪个位置上。那么N-1趟以后,序列自然就成了排序序列。</span>

具体实现方法如下:

首先我们在头文件中声明插入排序原型。

/**
* @file    Sort.h
* @brief   常用排序-声明部分
* @details
* @author  jason.mrbourne@gmail.com
* @date    2014-5-20
*/
#ifndef SORT_H_INCLUDED
#define SORT_H_INCLUDED

typedef int ElementType;
void InsertionSort(ElementType A[], int N); //插入排序


#endif // SORT_H_INCLUDED

然后再Sort.c源文件中实现插入排序。

/**
* @file    Sort.c
* @brief   常用排序-实现部分
* @details
* @author  jason.mrbourne@gmail.com
* @date    2014-5-20
*/
#include <Sort.h>

//插入排序
void InsertionSort(ElementType A[], int n)
{
    int j, P;   //P代表当前趟数

    ElementType Tmp;    //P位置上的元素
    for (P = 1; P < n; P++)
    {
        Tmp = A[P];
        //A[j-1]是P前P个元素 将其中比A[P]大的右移
        for (j = P; j > 0 && A[j-1] > Tmp; j--)
            A[j] = A[j-1];
        //当前j-1处是第一个不比A[P]大的位置 应该把A[P]放到它后面 即j处
        A[j] = Tmp;
    }
}

最后我们在主程序中测试其可行性。

/**
* @file    main.c
* @brief   常用排序-测试部分
* @details
* @author  jason.mrbourne@gmail.com
* @date    2014-5-20
*/
#include <stdio.h>
#include <stdlib.h>
#include <Sort.h>

int main()
{
    //用插入排序排序数组a
    int a[5] = {2,5,3,6,1};
    int i;
    InsertionSort(a,5);
    for (i = 0; i <5; i++)
        printf("%d\t", a[i]);
    return 0;
}



posted @ 2014-05-20 22:59  庄浩  阅读(115)  评论(0编辑  收藏  举报