希尔排序Linux下C实现

本次,我们谈论下希尔排序,希尔排序也叫递减增量排序算法。步长也是影响希尔排序的一个重要因素,我们这里主要用Marcin Ciura设计的步长。关键代码如下:

1、希尔排序头文件:shellSort.h

  1. #ifndef SHELLSORT_H  
  2.  
  3. #define SHELLSORT_H  
  • extern void shellSort(int * pArr, const int length); 
  • #endif 

2、希尔排序源文件:shellSort.c

  1. #include "shellSort.h"  
  2. void shellSort(int * pArr, const int length) 
  3.         const int pInc[9]={1,4,10,23,57,132,301,701,1750}; 
  4.         int len=sizeof(pInc)/sizeof(int); 
  5.         int i,k,j,tmp; 
  6.         int inc; 
  7.         k=0; 
  8.         while(*(pInc+k)<length && k<=len) 
  9.         { 
  10.                 k++; 
  11.         } 
  12.         while(--k>=0) 
  13.         { 
  14.                 inc=*(pInc+k); 
  15.                 for(i=inc; i< length; i++) 
  16.                 { 
  17.                         tmp=*(pArr+i); 
  18.                         j=i; 
  19.                         while(j>=inc && *(pArr+j-inc)>tmp) 
  20.                         { 
  21.                                 *(pArr+j)=*(pArr+j-inc); 
  22.                                 j=j-inc; 
  23.                         } 
  24.                         *(pArr+j)=tmp; 
  25.                 } 
  26.         } 

3、main头文件:main.h

  1. #ifndef MAIN_H  
  2. #define MAIN_H  
  3. #include<stdio.h>  
  4. #include "shellSort.h"  
  5. int main(void); 
  6. void showArr(const int *pArr, const int length); 
  7. void initRandomArr(int *pArr, const int length); 
  8. #endif 

4、main源文件:main.c

  1. #include "main.h"  
  2.  
  3. int main(void
  4.         printf("Input array length:\n"); 
  5.         int length; 
  6.         scanf("%d", &length); 
  7.         if(length<0) 
  8.         { 
  9.                 printf("Array length must be larger 0\n"); 
  10.                 return 1; 
  11.         } 
  12.         int arr[length]; 
  13.         initRandomArr(arr, length); 
  14.         printf("Get random array :\n"); 
  15.         showArr(arr, length); 
  16.         shellSort(arr, length); 
  17.         printf("shell sort result:\n"); 
  18.         showArr(arr, length); 
  19.         return 0; 
  20. void showArr(const int *pArr, const int length) 
  21.         int i; 
  22.         for(i=0; i<length; i++) 
  23.         { 
  24.                 printf("%d ", *(pArr+i)); 
  25.         } 
  26.         printf("\n"); 
  27. void initRandomArr(int *pArr, const int length) 
  28.         int i; 
  29.         srand(time(NULL)); 
  30.         for(i=0; i< length; i++) 
  31.         { 
  32.                 *(pArr+i)=rand()%1000; 
  33.         } 

5、编译:

  1. [root@localhost shellSort]$ gcc -c shellSort.c 
  2. [root@localhost shellSort]$ gcc -c main.c 
  3. [root@localhost shellSort]$ gcc -o main main.o shellSort.o

执行可执行文件main如下:   

  1. [root@localhost shellSort]$ ./main   
  2. Input array length: 
  3. 12 
  4. Get random array : 
  5. 518 713 265 31 350 931 592 872 489 927 640 106   
  6. shell sort result: 
  7. 31 106 265 350 489 518 592 640 713 872 927 931   

希尔排序是个不稳定的排序,性能优于直接插入排序。

你可能感兴趣的:(希尔排序Linux下C实现)