博客
关于我
插入排序、希尔排序、选择排序、计数排序
阅读量: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/

    你可能感兴趣的文章
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>
    Objective-C实现arithmetic算术算法(附完整源码)
    查看>>
    Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
    查看>>
    Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
    查看>>
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>
    Objective-C实现average mean平均数算法(附完整源码)
    查看>>
    Objective-C实现average median平均中位数算法(附完整源码)
    查看>>
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>
    Objective-C实现AvlTree树算法(附完整源码)
    查看>>
    Objective-C实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
    查看>>
    Objective-C实现BACKTRACKING 方法查找集合的幂集算法(附完整源码)
    查看>>
    Objective-C实现bailey borwein plouffe算法(附完整源码)
    查看>>