Dotcpp  >  编程教程  >  排序算法  >  希尔排序算法实例详解

希尔排序算法实例详解

点击打开在线编译器,边学边练

1. 复杂度与稳定性

算法时间复杂度

最坏情况:O(n^2)

最好情况:O(n)

平均情况:O(n^2)

 

稳定性:不稳定排序

2.过程介绍

希尔排序,又名递减增量排序算法,是一种非稳定的更高效的插入排序,在对几乎已经排好序的数据操作时,效率极高,即可以达到线性排序的效率,直接插入排序整体来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

过程如下:

1. 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

2. 按增量序列个数 k,对序列进行 k 趟排序;

3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

 

3. 图示过程

第一趟

10

50

30

20

70

70

40

60

第二趟

10

20

30

50

40

60

70

70

第三趟

10

20

30

40

50

60

70

70

第四趟

10

20

30

40

50

60

70

70

可以见的,相比直接插入排序由于可以每趟进行分段操作,故整体效率体现较高。

 

4. 相关的代码

#include<iostream>
using namespace std;
void shellSort(int arr[], int n) {
    int i, j, gap;
    for (gap = n / 2; gap > 0; gap /= 2) {
        for (i = 0; i < gap; i++) {
            for (j = i + gap; j < n; j += gap) {
                for (int k = j; k > i && arr[k] < arr[k-gap]; k -= gap) {
                    swap(arr[k-gap], arr[k]);
                }
            }
        }
    }
}
 
int main() {
    int a[8]= {70,50,30,20,10,70,40,60};
    int n=8;
    shellSort(a,n);
    for(int i=0; i<n; i++) {
        cout<<a[i]<<' ';
    }
    return 0;
}


作业:
1738排序

知识点标签:排序


本文固定URL:https://www.dotcpp.com/course/162

数据结构教程
第一章 数据结构入门
第二章 链表
第三章 栈
第四章 队列
第五章 C++STL库教程(附带题库)
第六章 串、数组、矩阵和广义表
第七章 树
第八章 图
第九章 查找算法
第十章 排序算法
第十一章 算法和竞赛
第十二章 后记
Dotcpp在线编译      (登录可减少运行等待时间)