插入排序

4 篇文章 0 订阅

继续研究太阳落雨兄的算法文章,本篇是插入排序。

一、算法描述

插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为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.csdn.net/cjf_iceking/article/details/7916194

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值