您的位置:首页 > 其它

直接插入排序

2017-02-23 16:34 169 查看


直接插入排序

直接插入排序是逐次将第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;
}
}


i和j取值:
第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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: