希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。
算法思想:
采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。
主要程序:
void shellSort(int *arr,int length){ int i,j,k; int increment = length; while(increment>0){ if(increment != 1) increment = increment/3+1; else break; for(i = increment; i<length; i++){ if(arr[i] < arr[i-increment]){ k = arr[i]; for(j=i-increment; j>=0 && k < arr[j] ; j-=increment){ arr[j+increment] = arr[j]; } arr[j+increment] = k; } } } }
全部代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5}; int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9}; int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0}; void copy(int *from,int *arr,int length); void print(int *arr,int length); void shellSort(int *arr,int length); int main(){ clock_t start,end; int Arr[10]; int i; copy(arrtest1,Arr,10); print(Arr,10); shellSort(Arr,10); print(Arr,10); start = clock(); for(i=0;i<100000;i++){ copy(arrtest1,Arr,10); //print(Arr,10); shellSort(Arr,10); //print(Arr,10); } end = clock(); printf("first test:%d ",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest2,Arr,10); //print(Arr,10); shellSort(Arr,10); //print(Arr,10); } end = clock(); printf("first test:%d ",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest3,Arr,10); //print(Arr,10); shellSort(Arr,10); //print(Arr,10); } end = clock(); printf("first test:%d ",end-start); getchar(); return 0; } void shellSort(int *arr,int length){ int i,j,k; int increment = length; while(increment>0){ if(increment != 1) increment = increment/3+1; else break; for(i = increment; i<length; i++){ if(arr[i] < arr[i-increment]){ k = arr[i]; for(j=i-increment; j>=0 && k < arr[j] ; j-=increment){ arr[j+increment] = arr[j]; } arr[j+increment] = k; } } } } void copy(int *from,int *arr,int length){ int i; for(i=0;i<length;i++){ arr[i] = from[i]; } } void print(int *arr,int length){ int i; for(i=0;i<length;i++){ printf("%d ",arr[i]); } printf(" "); }