八大排序算法(1)插入排序-直接插入排序 和 希尔排序

直接插入排序(Insertion Sort)

直接插入排序是最基本的插入排序算法,工作原理如下:

从第二个元素开始,将其与前面已经排好序的部分进行比较。

找到合适的位置后,将该元素插入到合适的位置,同时后面的元素右移。

重复上述步骤,直到所有元素都排好序。

时间复杂度

最好情况:O(n)(当数据已经是有序的情况下)

最坏情况:O(n^2)(当数据逆序时)

平均情况:O(n^2)

希尔排序(Shell Sort)

希尔排序是对直接插入排序的一种改进。希尔排序的基本思路是通过增大间隔 ,将数据分成若干子序列,每个子序列分别进行插入排序。随着排序的进行,逐步减小间隔,直到间隔为1时,进行常规的插入排序。

希尔排序的改进:

通过分组插入排序,减少了直接插入排序中的大量元素移动,从而提高了效率。

初始时,元素之间的间隔较大,可以让较远的元素更快地被"交换到"更接近的正确位置。

随着间隔的减小,数据逐渐有序,最后的插入排序不需要进行大量的元素移动。

时间复杂度

最坏情况:O(n^2)(取决于增量序列的选择)

最好情况:O(n log n)(如果使用合适的增量序列)

平均情况:通常比直接插入排序快很多,但具体时间复杂度依赖于增量序列的选择。

特性 直接插入排序 希尔排序
原理 将元素插入到已排序部分的合适位置 通过增大间隔逐步进行插入排序,间隔逐步缩小,最终间隔为 1
时间复杂度 最坏:O(n²),最好:O(n),平均:O(n²) 最坏:O(n²),最好:O(n log n),平均:O(n log n)
空间复杂度 O(1)(原地排序) O(1)(原地排序)
适用场景 小规模数据或数据几乎已经有序时 中等规模数据,尤其是对大规模数据能提高效率
稳定性 稳定 不稳定

直接插入排序 是一种简单的排序方法,适合小规模数据或者数据已经基本有序的情况。

希尔排序 是对插入排序的改进,通过增大间隔,逐步提高数据的有序性,从而提高排序效率。

下述为插入排序的源码。

cpp 复制代码
#include <stdio.h>

//49,38,65,97,76,13,27,49

void shellSort(int arr[],int n){
    int gap,i,j,temp;
    for(gap = n/2 ; gap > 0  ; gap /= 2){
        for(i = gap ; i < n ; ++i){
            temp = arr[i];
            j = i;
            while (j >= gap && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
    }
}

void insertionSort(int arr[],int n){
    int i,j,key;
    for(i=1; i<n ;++i){
        key = arr[i];
        j = i-1;
        while(j >= 0 && arr[j] > key ){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

void printArray(int arr[],int n){
    for(int i=0 ; i<n ; ++i){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {49,38,65,97,76,13,27,49};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("原始数组: ");
    printArray(arr,n);
//    insertionSort(arr,n);
    shellSort(arr,n);
    printf("排序后的数组: ");
    printArray(arr,n);
    return 0;
}
相关推荐
TL滕1 天前
从0开始学算法——第十八天(分治算法)
笔记·学习·算法
LYFlied1 天前
【每日算法】LeetCode 84. 柱状图中最大的矩形
前端·算法·leetcode·面试·职场和发展
CoderCodingNo1 天前
【GESP】C++三级真题 luogu-B4414 [GESP202509 三级] 日历制作
开发语言·c++·算法
Liangwei Lin1 天前
洛谷 P1955 [NOI2015] 程序自动分析
算法
zwjapple1 天前
全栈开发面试高频算法题
算法·面试·职场和发展
不穿格子的程序员1 天前
从零开始写算法——链表篇5:K个一组翻转链表 + 排序链表
算法·链表·分治
青鸟2181 天前
从资深开发到脱产管理的心态转变
后端·算法·程序员
晨曦夜月1 天前
笔试强训day7
开发语言·c++·算法
iAkuya1 天前
(leetcode)力扣100 14合并区间(差分/排序)
算法·leetcode·职场和发展
leiming61 天前
C++ 02 函数模板案例
开发语言·c++·算法