希尔排序

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

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语言到C++
第六章 串,数组,矩阵,广义表
第七章 树
第八章 图
第九章 算法—查找
第十章 算法—排序
第十一章 算法&竞赛,思维培养
第十二章 后记
Dotcpp在线编译      (登录可减少运行等待时间)