希尔排序
先将整个待排序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对整个记录进行一次直接插入排序,其实希尔排序就是分组直接插入排序。
java代码:
public class ShellSort { public static void main(String[] args) { int array[] = {2,10,4,5,1,8}; showArray(array); System.out.println("\n排序后"); shellSort(array); showArray(array); } private static void shellSort(int[] arr) { int i,j,step; int len = arr.length; for(step = len/2;step>0;step/=2) { for(i = 0;i<step;i++) { for(j=i+step;j<len;j+=step) { if(arr[j]<arr[j-step]) { int temp = arr[j]; int k = j - step; while(k>=0 && arr[k]>temp) { arr[k+step] = arr[k]; k-=step; } arr[k+step] = temp; } } } } } private static void showArray(int[] a) { for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } } }
C代码:
//希尔排序
#include<stdio.h> void showArray(int a[],int len) { for(int i=0;i<len;i++) { printf("%d ",a[i]); } } void shellSort(int arr[],int len) { int i,j,step; for(step = len/2;step>0;step/=2) { for(i = 0;i<step;i++) { for(j=i+step;j<len;j+=step) { if(arr[j]<arr[j-step]) { int temp = arr[j]; int k = j - step; while(k>=0 && arr[k]>temp) { arr[k+step] = arr[k]; k-=step; } arr[k+step] = temp; } } } } } int main() { int array[] = {2,10,4,5,1,8}; int len = sizeof(array)/sizeof(int); showArray(array,len); printf("\n排序后\n"); shellSort(array,len); showArray(array,len); return 0; }
希尔排序是不稳定的排序,希尔排序的执行时间依赖于增量序列,其平均时间复杂度为O(n1.3)。
希尔排序最好时间复杂度O(n),最坏O(n^2)