插入排序,希尔排序,堆排序

  

本文将介绍三种排序算法——插入排序,希尔排序,堆排序。

,一.插入排序

,,算法思想

,,维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较。

如:有序数组:1,3,5,6,7,现在待插入数据为2,那么他将会和7、6、5、3、依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止。

,,代码实现

void  InsertSort (int *,,, int 大小)   {   assert ();   for  (int 小姐:=,0;,小姐:& lt;, size 作用;1;,+ + i)   {   int 最终获得=,我,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//标识有序数组的最后一位   int  tmp =,(最终获得+,1);   while (0,最终获得的在=,,,,,tmp  & lt;,一个[结束])   {   (最终获得+,- 1),=,[结束];,,,,,,,,,,,,,,,,,,,,,//待插入数据比有序数组的最后一个数小,将有序数组最后一位向后移位   ——结束;   }   (最终获得+,- 1),=,tmp;   }   }

,,总结

插入排序,希尔排序,堆排序”>,,1.插入排序可以认为是间距为1的插入算法,说这个是为了待会儿更好的理解希尔排序。</p> <p>,,,</p> <p> </p> <p> </p> <p> </p> <p>, </p> <p>,二.希尔排序</p> <p>,,算法思想</p> <p>,,希尔排序可以认为是插入排序的增强版,因为,他加入了一个预排的过程,即在实现间距为1的插入算法之前,他已经预先将间距为差距(差距一直减减直到祝辞0)的数组排列过了,所以,当进行差距=1的插入排序之前使得待排序数组已经高度接近有序,使得这次进行的差距=1的排序的时间复杂度,可以小于O (N ^ 2)(差距=1的插入排序,最好情况的时间复杂度为O(1),前面的预排过程正是出于这个目的)。</p> <p>,,代码实现</p> <pre类=//希尔排序   void  ShellSort (int *, size_t 大小)   {   assert ();   int  gap =, size /, 2;   while  (gap 祝辞,0)   {   for  (int 小姐:=,0;,小姐:& lt;, size 作用;差距;,+ + i)   {   int 最终获得=,我,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   int  tmp =,(最终获得+,差距);   while (0,最终获得的在=,,,,,tmp  & lt;,一个[结束])   {   (最终获得+,差距),=,[结束];,,,,,,,,,,,,,,,,,,,,   最终获得-=,差距;   }   (最终获得+,差距),=,tmp;   }   ——差距;   }   }

,总结

插入排序,希尔排序,堆排序”>,上图为差距=5的时候的预排效果图</p> <p>, 1。希尔排序预排的思想和插入排序的思想是一致的,只的是,他把原数组分成不同的区间。</p> <p>, </p> <p> </p> <p> <br/> </p> <p>,三。堆排序</p> <p>,算法思想</p> <p> <img src= void  AdjustDown (int *,,, size_t 大小,int 父母)   {   assert ();   int  child =, parent  *, 2, +, 1;   while  (child<大小)   {   if (孩子+ 1 & lt; size ,,,一个(孩子),& lt;,一个[child  +, 1])   + +孩子;   if ((父),& lt;,(孩子))   {   交换((父),(孩子));   时间=parent 儿童;   *=child  parent  2, +, 1;   }   其他的   {   打破;   }      }   }   void 堆排序(int *, size_t 大小)   {   assert ();//建堆   for  (int 小姐:=,(size 安康;2),/,2,,小姐:祝辞=,0;,,),,//从第一个非叶子节点开始调   {   AdjustDown(大小,,,,我);   }   for  (size_t 小姐:=,0;,小姐:& lt;,大小;,+ + i)   {   交换(一个[0],[size 作用;1,安康;我]);   AdjustDown (a,, size 安康;小姐:安康;1,0);   }   }

,总结

,


插入排序,希尔排序,堆排序