希尔排序

来源:互联网 发布:苹果mac系统更新 编辑:程序博客网 时间:2024/04/29 18:58


希尔排序

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

希尔排序是插入排序的升级,是从第i-gap个元素逐次以gap递减到0,和第i个元素比较,若当前元素大(小)于第i个元素,当前元素向后移位,否则,退出循环,并且当前元素等于第i个元素。由于在排序过程中,采用跳跃式比较和交换(移位),因此希尔排序是不稳定的。

可参考维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F

c代码:


void ShellSort (int * const pia, const int n){   int i;   int j;   int gap = n>>1; // n/2   int temp;   while (0 < gap)   {      for (i=gap; i<n; i++)      {         temp = pia[i]; // 可以不使用temp,直接用pia[i]         for (j=i; (j>gap-1)&&(pia[j-gap]>temp); j-=gap)            pia[j] = pia[j-gap];         pia[j] = temp;      }      gap >>= 1; // gap/2   }}

gap ij取值:

gap的取值有说法可参考上面的网址;

在插入排序中,i的初始值是从1开始直到n-1,因为第0个是有序的,在希尔排序中,i初始值从gap开始直到n-1,因为gap的最小值是1而不是0;

j的取值是比较当前和距离gap位置的值,如果小(大)于,则移位,否则退出;

在比较条件满足时,可以采用移位,也可以采用交换(类似冒泡)。

完整c代码:

#include <stdio.h>#include <stdlib.h>#include<windows.h>void ShellSort (int * const pia, const int n){   int i;   int j;   int gap = n>>1; // n/2   int temp;   while (0 < gap)   {      for (i=gap; i<n; i++)      {         temp = pia[i]; // 可以不使用temp,直接用pia[i]         for (j=i; (j>gap-1)&&(pia[j-gap]>temp); j-=gap)            pia[j] = pia[j-gap];         pia[j] = temp;      }      gap >>= 1; // gap/2   }}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 ();    ShellSort (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
原创粉丝点击