加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么插入排序最佳情况大O复杂度O(n)?

发布时间:2020-12-16 10:32:20 所属栏目:百科 来源:网络整理
导读:以下是我的插入排序代码: void InsertionSort(vectorint ioList){ int n = ioList.size(); for (int i = 1 ; i n ; ++i) { for (int j = 0 ; j = i ; ++j) { //Shift elements if needed(insert at correct loc) if (ioList[j] ioList[i]) { int temp = ioL
以下是我的插入排序代码:

void InsertionSort(vector<int> & ioList)
{
  int n = ioList.size();
  for (int i = 1 ; i < n ; ++i)
  {
    for (int j = 0 ; j <= i ; ++j)
    {
      //Shift elements if needed(insert at correct loc)
      if (ioList[j] > ioList[i]) 
      {
        int temp = ioList[j];
        ioList[j] = ioList[i];
        ioList[i] = temp;
      }
    }
  }
}

算法的平均复杂度为O(n ^ 2).

根据我对大O符号的理解,这是因为在这种情况下我们运行两个循环(外部一个n-1次,内部一个1,2,… n-1 = n(n-1)/ 2次因此由此产生的算法的无症状复杂性为O(n ^ 2).

现在我已经读过,输入数组已经排序的情况就是最好的情况.
在这种情况下,算法的大O复杂度是O(n).但是我无法理解这是如何可能的,因为在两种情况下(平均情况和最佳情况)我们必须运行相同次数的循环并且必须比较元素.唯一可以避免的是元素的转移.

那么复杂性计算也涉及这种交换操作的一个组成部分?

解决方法

是的,这是因为您的实施不正确.内循环应该从i-1向下计数到0,并且一旦找到已经小于ioList [i]的元素ioList [j]就应该终止.

正是由于该终止标准,算法在最佳情况下在O(n)时间内执行:

如果输入列表已经被排序,则内循环将立即终止任何i,即所执行的计算步骤的数量最终与执行外循环的次数成比例,即O(n).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读