数据结构与算法分析-插入排序
我们先来看一种最简答的排序方法-插入排序,插入排序通过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;
}