排序算法:插入排序

一、原理

对于长度为n的数组,遍历其中元素,并且将其插入其之前一段有序数据中合适的位置。

二、程序

(1)从第1个数据取起,向其之前(第0个、…)查找第一个小于该数据的位置为i;
(2)将i之后的元素向后转移1位;
(3)将该元素放入第i+1位。

三、实现

#include <cstdio>

int main() {
    int n;
    scanf("%d", &n);
    int data[n + 5];
    int i;
    for(i = 0; i < n; i++) {
        scanf("%d", &data[i]);
    }

    int j, k, temp;
    for(i = 1; i < n; i++) {
        for(j = i - 1; j >= 0; j--) if(data[j] < data[i]) break; // 取得插入a[i]的合适位置为j
        if(j != i - 1) {
            temp = data[i];
            for(k = i - 1; k > j; k--) {
                data[k + 1] = data[k];
            } 
            data[k + 1] = temp;
        }
    } 

    for(i = 0; i < n; i++) {
        printf("%d ", data[i]);
    }
    return 0;
}

四、思考

还有什么可以减少时间消耗的方法?
参考:优化的直接插入排序(二分查找插入排序,希尔排序) - 滴答的雨
排序算法:希尔排序(优化插入排序)(By KSkun)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值