博客
关于我
插入排序、希尔排序、选择排序、计数排序
阅读量:351 次
发布时间:2019-03-04

本文共 2775 字,大约阅读时间需要 9 分钟。

插入排序、希尔排序、选择排序和计数排序是四种常见的排序算法,每种算法都有其独特的实现原理、优缺点和应用场景。本文将详细分析这四种排序算法的实现方法及其特性。

插入排序

插入排序是一种简单且有效的排序算法,其核心思想是将数组视为有序和无序两部分。每次从无序部分中选择一个元素并将其插入有序部分中。以下是插入排序的实现代码:

void InsertSort(int *arr, int size) {    for (int i = 0; i < size - 1; i++) {        int end = i;        int key = arr[end + 1];        while (end >= 0 && arr[end] > key) {            arr[end + 1] = arr[end];            end--;        }        arr[end + 1] = key;    }}

特性分析:

  • 元素接近有序程度:插入排序的性能依赖于数组的初始有序程度,元素越接近有序,排序效率越高。
  • 适用场景:非常适合小规模数据或基本有序的数据,效率很高。
  • 时间复杂度:最优情况为O(N),最差情况为O(N²)。
  • 空间复杂度:O(1)。
  • 稳定性:插入排序具有稳定性,相对元素的位置不会改变。
  • 数据敏感度:对数组的有效性高度敏感,逆序数组时效率最低。
  • 希尔排序

    希尔排序是对插入排序的优化,通过增加插入间隔(gap)来提高数组的有序程度,从而提升排序效率。希尔排序的实现代码如下:

    void ShellSort(int *arr, int size) {    int gap = size;    while (gap > 1) {        gap = gap / 2;        for (int i = 0; i < size - gap; i++) {            int end = i;            int key = arr[end + gap];            while (end >= 0 && arr[end] > key) {                arr[end + gap] = arr[end];                end -= gap;            }            arr[end + gap] = key;        }    }}

    特性分析:

  • 优化插入排序:希尔排序通过调整插入间隔提高了插入排序的效率。
  • 时间复杂度:平均情况为O(N¹.3),最坏情况为O(N²)。
  • 空间复杂度:O(1)。
  • 稳定性:不具备稳定性,可能改变元素的相对位置。
  • 数据敏感度:与插入排序一样,敏感度较高。
  • 适用场景:在大部分数据接近有序时,希尔排序的性能优于插入排序。
  • 选择排序

    选择排序通过不断地选取数组中的最大值和最小值,分别放在数组的两端来实现排序。其实现代码如下:

    void Swap(int *arr, int sub1, int sub2) {    int temp = arr[sub1];    arr[sub1] = arr[sub2];    arr[sub2] = temp;}void SelectSort(int *arr, int size) {    int begin = 0;    int end = size - 1;    while (begin < end) {        int min = begin;        int max = end;        for (int i = begin; i <= end; i++) {            if (arr[i] < arr[min]) {                min = i;            }            if (arr[i] > arr[max]) {                max = i;            }        }        Swap(arr, begin, min);        if (max == begin) {            max = min;        }        Swap(arr, end, max);        begin++;        end--;    }}

    特性分析:

  • 时间复杂度:O(N²)。
  • 空间复杂度:O(1)。
  • 稳定性:不稳定,可能改变元素的相对位置。
  • 数据敏感度:不敏感,无论数据是否有序都需要遍历。
  • 适用场景:适用于对数据敏感度要求不高的场景。
  • 计数排序

    计数排序通过统计数组中每个元素的出现次数来实现排序。其实现代码如下:

    void CountSort(int *arr, int size) {    assert(arr);    int max = arr[0];    int min = arr[0];    for (int i = 0; i < size; i++) {        if (arr[i] > max) {            max = arr[i];        }        if (arr[i] < min) {            min = arr[i];        }    }    int *temp = (int *)malloc(sizeof(int) * (max - min + 1));    memset(temp, 0, sizeof(int) * (max - min + 1));    for (int i = 0; i < size; i++) {        temp[arr[i] - min]++;    }    int sub = 0;    for (int i = 0; i < max - min + 1; i++) {        while (temp[i]) {            arr[sub++] = i + min;            temp[i]--;        }    }    free(temp);}

    特性分析:

  • 适用范围:仅适用于整数排序。
  • 时间复杂度:O(N + max - min)。
  • 空间复杂度:O(max - min + 1)。
  • 稳定性:不稳定,无法维护原有元素的相对顺序。
  • 数据敏感度:不敏感,无论数据是否有序都需要处理。
  • 缺陷:需要额外的空间来存储统计结果,且只适用于整数数据。
  • 转载地址:http://vmse.baihongyu.com/

    你可能感兴趣的文章
    Python变量与运算符
    查看>>
    Python变量/运算符/函数/模块/string
    查看>>
    python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
    查看>>
    python系列【仅供参考】:python flask框架 debug功能
    查看>>
    python发送notes邮件_使用python在Lotus Notes中发送邮件
    查看>>
    Python双版本下创建一个Scrapy(西瓜皮)项目
    查看>>
    Python双版本下No module named 'requests'
    查看>>
    python及pycharm2018软件安装教程
    查看>>
    python去重txt文本_Python实现的txt文件去重功能示例
    查看>>
    python去掉列表的逗号,从Python列表项中删除标点符号
    查看>>
    Python卸载所有包
    查看>>
    python单线程下实现多个socket并发
    查看>>
    Python单元测试框架介绍(超详细~)
    查看>>
    Python单元测试框架
    查看>>
    python单元测试之unittest
    查看>>
    Python单元测试unittest实战
    查看>>
    Python单元测试-模拟VS补丁
    查看>>
    python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
    查看>>
    Python十进制&;包提供错误的结果
    查看>>
    Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
    查看>>