排序系列算法——希尔排序

希尔排序能够说是插入排序的增强版,经过对原始数据进行分组再排序,更高效地完成对数据的排序工做。算法

1.从插入排序到希尔排序数组

回顾插入排序的基本知识,插入排序经过不断将无序的元素插入到已排序的序列中,直到全部的元素都已经插入位置。spa

插入排序一个很明显的缺点是插入元素时须要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的状况,若是原始的数组是倒序的,每插入一个元素时都要跟全部已经排好序的元素进行对比,算法的效率很低。3d

可是若是插入元素时对比的次数较少,可以大大提升算法的效率,希尔排序就是经过将元素数组划分为若干小组,而后对各个小组进行插入排序来减低元素之间对比的次数,提升排序的效率。code

2.希尔排序的执行过程blog

希尔排序首先选择一个元素选择步长将数组划分为若干小组,对各个小组分别进行排序,而后不断将步长缩小,不断分组和排序,直到后的步长为1,对全部的元素进行排序,此时,通过前期的排序工做,可以减小全体元素插入排序的对比次数,大大下降了排序的时间复杂度。排序

以一个实际的例子说明希尔排序的执行过程:源码

将数组{13,7,3,8,12,510,2}从小到大进行排序。class

第一次分组排序:选择步长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 }
相关文章
相关标签/搜索