继续研究太阳落雨兄的算法文章,本篇是插入排序。
一、算法描述
插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中……第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。
0 1 2 3 4 5 6 7 8 9
----------------------------------------------------------------------
3 55 1 232 11 6 9 8 1 10
move begin:2
1 3 55 232 11 6 9 8 1 10
move begin:4
1 3 11 55 232 6 9 8 1 10
move begin:5
1 3 6 11 55 232 9 8 1 10
move begin:6
1 3 6 9 11 55 232 8 1 10
move begin:7
1 3 6 8 9 11 55 232 1 10
move begin:8
1 1 3 6 8 9 11 55 232 10
move begin:9
1 1 3 6 8 9 10 11 55 232
done
1 1 3 6 8 9 10 11 55 232
二、算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于记录需要插入的数据)
稳定性:稳定
三、算法实现
#include <stdlib.h>
#include <stdio.h>
#include "print.c"
/********************************************************
* *函数名称:InsertSort
* *参数说明:pDataArray 无序数组;
* * iDataNum为无序数据个数
* *说明: 插入排序
* *********************************************************/
void InsertSort(int* pDataArray, int iDataNum)
{
int i = 1, j,k,temp;
for (i = 1; i < iDataNum; i++) //从第2个数据开始插入
{
j = 0;
while (j < i && pDataArray[j] <= pDataArray[i]) //寻找插入的位置
{
j++;
}
if (j < i) //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入
{
printf("move begin:%d\n",i);
k = i;
temp = pDataArray[i];
while (k > j) //挪动位置
{
pDataArray[k] = pDataArray[k-1];
k--;
}
pDataArray[k] = temp; //插 入
print(pDataArray, iDataNum);
}
}
}
int main()
{
int iDataNum = 10;
int pDatas[10] = {3,55,1,232,11,6,9,8,1,10};
printf("init\n");
print(pDatas, iDataNum);
InsertSort(pDatas, iDataNum);
printf("\ndone\n");
print(pDatas, iDataNum);
}
参考文章:http://blog.youkuaiyun.com/cjf_iceking/article/details/7916194