当前位置:   article > 正文

直接插入排序、希尔排序_为什么希尔排序分组后排序用插入排序,那为什么不直接用插入排序

为什么希尔排序分组后排序用插入排序,那为什么不直接用插入排序

一.直接插入排序:

原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。

最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。
最差复杂度:当输入数组为倒序时,复杂度为O(n^2)
插入排序比较适合用于“少量元素的数组”。

  1. int* InsertSort(int a[] , int n) {
  2. for(int i = 1; i < n ; i++) {
  3. if(a[i] < a[i-1]) {
  4. int tmp = a[i];
  5. int j = i-1;
  6. while(j >= 0 && tmp < a[j]){
  7. a[j+1] = a[j];
  8. j--;
  9. }
  10. a[j+1] = tmp;
  11. }
  12. }
  13. return a;
  14. }

二.希尔排序
基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
先将要排序的一组记录按某个增量dn/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
  1. /**
  2. * 直接插入排序的一般形式
  3. *
  4. * @param int dk 缩小增量,如果是直接插入排序,dk=1
  5. *
  6. */
  7. void ShellInsertSort(int* a , int n ,int dk) {
  8. for(int i = dk ; i < n ;i++) {
  9. if(a[i] < a[i-dk]){
  10. int tmp = a[i];
  11. int j = i-dk;
  12. while(j >= 0 && tmp < a[j]) {
  13. a[j+dk] = a[j];
  14. j-=dk;
  15. }
  16. a[j+dk] = tmp;
  17. }
  18. }
  19. }
  20. /**
  21. * 先按增量d(n/2,n为要排序数的个数进行希尔排序
  22. *
  23. */
  24. void ShellSort(int* a ,int n) {
  25. int dk = n/2;
  26. while(dk >=1) {
  27. ShellInsertSort(a , n ,dk);
  28. dk=dk/2;
  29. }
  30. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/786899
推荐阅读
相关标签
  

闽ICP备14008679号