直接插入排序



直接插入排序

直接插入排序是逐次将第i-1个元素到第0元素和第i个元素比较,若当前元素大(小)于第i个元素,当前元素向后移位,否则,退出循环,并且当前元素等于第i个元素。

可参考百度百科直接插入排序:http://baike.baidu.com/item/%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F?sefr=cr

c代码如下:

void InsertSort (int * const pia, const int n)
{
   int i;
   int j;
   int temp;

   for (i=1; i<n; i++)
   {
       temp = pia[i];
       for (j=i; j>0 && pia[j-1]>temp; j--)
          pia[j] = pia[j-1];
       pia[j] = temp;
   }
}


ij取值:

0个元素一开始是有序的,因此i从第1个元素开始直至第n-1个元素,即i<n

j的元素取值是从i-1开始直至0,按正常理解写法如下。

void InsertSort (int * const pia, const int n)
{
   int i;
   int j;
   int temp;

   for (i=1; i<n; i++)
   {
       temp = pia[i];
       for (j=i-1; j>=0 && pia[j]>temp; j--)
          pia[j+1] = pia[j];
       pia[j+1] = temp;
   }
}

j必须取到0元素。

当不满足条件时,当前元素的上一个元素位置是空的,将i元素填入。<-----正常理解写法

当不满足条件时,当前元素(因为内循环比较的是当前元素的下一个元素,即j-1)的位置是空的,将i元素填入。<-----本文所用c写法

由于i前面的元素已经是有序的,因此在查找插入位置时,也有采用二分查找,但必须是右闭区间,否则,排序将不稳定。

在查找位置时,也有进行两两相邻交换的方法(有点类似冒泡的意思)。

完整c代码:

#include <stdio.h>
#include <stdlib.h>

#include<windows.h>

void InsertSort (int * const pia, const int n)
{
   int i;
   int j;
   int temp;

   for (i=1; i<n; i++)
   {
       temp = pia[i];
       for (j=i; j>0 && pia[j-1]>temp; j--)
          pia[j] = pia[j-1];
       pia[j] = temp;
   }
}


int testArray[] = {1,3,5,7,9,2,4,6,8,0};

void PrintfIntArray (int * const pia, const int n)
{
    int i;
    for (i=0; i<n; i++)
        printf("%u ", pia[i]);
    printf("\n");
}

int main()
{
    DWORD startTime;
    DWORD endTime;
    printf("Hello world!\n");

    startTime = GetTickCount ();
    InsertSort (testArray, sizeof(testArray)/sizeof(int));
    endTime = GetTickCount();
    printf ("Sort Time Consumption:%lu ms.\n", endTime-startTime);
    PrintfIntArray (testArray, sizeof(testArray)/sizeof(int));

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值