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