直接插入排序

来源:互联网 发布:windows确认证书 编辑:程序博客网 时间:2024/06/07 14:50


直接插入排序

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



0 0
原创粉丝点击