挑战程序设计竞赛选读-插入排序

挑战程序设计竞赛选读

一、初等排序

1.插入排序

插入排序是指将未排序序列分为已排序列和待排序列,通过将第一个待排序列的元素插入到已排序列的方式使整个序列逐渐全部有序。

正确性分析:每次插入,都会使已排序列增长,待排序列减少,符合减而治之(decrease-and-conquer)的分析问题的原则。

复杂度分析:在最坏的情况下(整个倒序),每次插入都会使其后的元素全部移动,当序列长为N时,需移动
1 + 2 + 3 + ⋯ + N = N ( N − 1 ) 2 = O ( N 2 ) 1+2+3+\dots+N = \frac{N(N-1)}{2}=O(N^2) 1+2+3++N=2N(N1)=O(N2)
即,时间复杂度为 O ( N 2 ) O(N^2) O(N2) 级。

图例:

待排序列

在这里插入图片描述

排序过程:
在这里插入图片描述

C++实现:

#include<iostream>
#include<vector>
using namespace std;
void trace(vector<int> const a)
{
    for(auto i : a)
    cout<<i<<' ';
    cout<<endl;

}
void insertSort(vector<int> & a)
{
    size_t length = a.size();
    for(size_t i = 1; i < length;i++) //待排序列从下标1开始
    {
        int v = a[i] ; //待排元素
        int j = i-1 ; //已排序列的最后一个元素位置
        while (j >= 0 && a[j] > v)  //将待排元素与已排数组由后向前比较(便于插入时移动元素),比它大的后移
        {
            a[j+1] = a[j];
            j -- ;
        }//找到已排序列中比待排元素小的位置了
        a[j+1] = v;
        trace(a);
    }
}

int main()
{
    vector<int> a = {8,6,7,1,5};
    trace(a);
    insertSort(a);
    return 0;
}

rust实现:待更(我还在学习,hahahaha…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值