排序算法总结

常用算法的特点总结:

排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序不稳定
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
希尔排序 O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序不稳定
归并排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
快速排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
堆排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
计数排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
桶排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定
基数排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)内排序稳定

插入排序
向一个有序数组a[n]中插入一个新元素x,使得新的数组a[n+1]依然是一个有序数组;

算法实现思路:
1、找到新元素x在有序数组a[n]中的大小位置:从有序数组a[0]开始循环,与x比较大小,当x小于数组中的值时,停止循环,记录数组下标index;
2、将数组中大于x的数全部向后移动一个单位的长度;
3、将新元素插入index所在的位置;

代码实现:

void insert_sort(int a[], const int n) {
    for (int i = 1; i < n; i++) {
        int temp = a[i];
        int j = i - 1;
        for (; j >= 0 && a[j] > temp; j--) {
            a[j + 1] = a[j];
        }
        a[j + 1] = temp;
    }
}

上述代码来自极客时间专栏《数据结构与算法之美》的第11节。
插入排序算法的实现有很多种,每个人的实现方式都不尽相同,但上述这种是目前已知代码比较简洁,效率较高的一种实现;

冒泡排序
依次比较相邻两个元素的大小,若前面的元素较大,则交换两个元素的位置,否则不交换。

代码实现

void bubble_sort(int a[], const int n) {
    for(int j = 0; j < n; j++) {
        int swap_flag = 0;
        for (int i = 0; i < n - 1; i++) {
            if (a[i] > a[i + 1]) {
                int temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                swap_flag = 1;
            }
        }
        if(swap_flag == 0) {
            break;
        }
    }
}

希尔排序

void shell_sort(int a[], const int n) {
    for(int k = n / 2; k > 0; k /= 2) {
        for (int i = k; i < n; i++) {
            int temp = a[i];
            int j = i;
            for (; j >= k && a[j - k] > temp; j-= k) {
                a[j] = a[j-k];
            }
            a[j] = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值