希尔排序可以说是插入排序的加强版,通过对原始数据进行分组再排序,更高效地完成对数据的排序工作。
1.从插入排序到希尔排序
回顾插入排序的基本知识,插入排序通过不断将无序的元素插入到已排序的序列中,直到所有的元素都已经插入位置。
插入排序一个很明显的缺点是插入元素时需要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的情况,如果原始的数组是倒序的,每插入一个元素时都要跟所有已经排好序的元素进行对比,算法的效率很低。
但是如果插入元素时对比的次数较少,能够大大提高算法的效率,希尔排序就是通过将元素数组划分为若干小组,然后对各个小组进行插入排序来减低元素之间对比的次数,提高排序的效率。
2.希尔排序的执行过程
希尔排序首先选择一个元素选择步长将数组划分为若干小组,对各个小组分别进行排序,然后不断将步长缩小,不断分组和排序,直到后的步长为1,对所有的元素进行排序,此时,经过前期的排序工作,能够减少全体元素插入排序的对比次数,大大降低了排序的时间复杂度。
以一个实际的例子说明希尔排序的执行过程:
将数组{13,7,3,8,12,510,2}从小到大进行排序。
第一次分组排序:选择步长8/2=4,图下方的数组表示分组情况
第二次排序:选择步长4/2=2;
第三次分组排序:选择步长2/2=1;
3.C++源码
1 void ShellSort(int array[]){ 2 3 int index = sizeof(array)/2; 4 5 int temp=0; 6 7 while(index>=1){ 8 9 for(int i=index;i<length;i++){ 10 11 for(int j=i-index;j>=0;j-=index){ 12 13 if(array[j]>array[j+index]){ 14 15 temp = array[j]; 16 17 array[j] = array[j+index]; 18 19 array[j+index]=temp; 20 21 } 22 23 } 24 25 } 26 27 index = index/2; 28 29 } 30 31 }