各种排序算法,用C语言实现

这篇博客详细介绍了包括直接插入排序、二分插入排序、Shell排序、冒泡排序、快速排序、选择排序、堆排序、归并排序在内的多种排序算法的C语言实现。文章阐述了各排序算法的时间和空间复杂度,并提供了完整的代码实现链接。
摘要由CSDN通过智能技术生成

你心爱的各种排序算法,用 C 语言实现。

我们下面将要实现的算法,全部准循这个接口:

// sort 对数组 A 的前 n 个元素进行原址排序
typedef void (*sort)(int A[], int n);

直接插入排序

遍历,往前找到合适的位置,逐个元素后移腾出空间,插入进去。

复杂度:

  • 时间 O ( n 2 ) O(n^2) O(n2)
  • 空间 O ( 1 ) O(1) O(1)
void
insert_sort(int A[], int n)
{
   
    for (int i = 0; i < n; ++i) {
   
        int curr = A[i];

        int j = i - 1;
        while (j >= 0 && curr < A[j]) {
   
            A[j + 1] = A[j];
            --j;
        }

        A[j + 1] = curr;
    }
}

二分插入排序

就是直接插入里往前找合适位置那里用个二分查找。

复杂度:

  • 时间:较好 O ( n log ⁡ ( n ) ) O(n \log(n)) O(nlog(n)),较坏 O ( n 2 ) O(n^2) O(n2),平均 O ( n 2 ) O(n^2) O(n2)
  • 空间 O ( 1 ) O(1) O(1)
void
binary_insert_sort(int A[], int n)
{
   
    for (int i = 0; i < n; ++i) {
   
        int curr = A[i];

        // 二分查找
        int l = 0, r = i - 1;
        while (r >= 0 && l < i && l <= r) {
   
            int m = (l + r) / 2;
            if (curr < A[m]) {
   
                r = m - 1;
            } else {
   
                l = m + 1;
            }
        }
        // 后移
        for (int j = i - 1; j >= l; --j) {
   
            A[j + 1] = A[j];
        }
        // 插入
        A[l] = curr;
    }
}

Shell 排序

递减增量(gap)的排序算法(非稳定)。就是分好几轮排序,每轮里在隔 gap 个的序列里调整插入。

空间复杂度是 O ( 1 ) O(1) O(1),时间复杂度依赖于步长序列。

void
shell_sort(int A[], int n)
{
   
    int gap;
    foreach_gaps(gap, n, {
   
        // 里面就是个插入排序:
        for (int i = gap; i < n; i++) {
   
            int curr = A[i];
            int j = i - gap;
            for (; j >= 0 && A[j] > curr; j -= gap) {
   
                A[j + gap] = A[j];
            }
            A[j + gap] = curr;
        }
    });
}

foreach_gaps 遍历增量序列,将步长值放到 gap 中。可以选用多种步长序列(注意步长最后一步务必为 1):

  • Shell 步长序列: n / 2 i n/2^i n/2i,最坏情况下时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值