微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#中数组类型数据结构的选择排序时间复杂度

如何解决C#中数组类型数据结构的选择排序时间复杂度

我在 C# 中使用数组(不是数组列表)实现了选择排序。大多数地方提到的选择排序的时间复杂度是O(n^2)。

在我下面的实现中,我将其视为 O(n^3)。有没有办法让它变成O(n^2)?

在许多书中,将选择排序的时间复杂度定义为 O(n^2),我看到作者没有考虑数组中弹出或元素删除步骤的时间复杂度,这也是 O(n)。

using System;
public class SortArray
{
 public int[] SlectionSort(int[] arr)
 {
   int[] newarr = new int[arr.Length];
   for(int i=0; i<newarr.Length; i++)
   {
     int smallest_index = findSmallest(arr);
     newarr[i] = arr[smallest_index];
     arr = pop(arr,smallest_index);
   }
   return newarr;
 }

 public int findSmallest(int[] arr)
 {
   int smallest = arr[0];
   int smallest_index = 0;

   for(int i = 1; i < arr.Length; i++)
   {
     if(arr[i] < smallest)
     {
       smallest = arr[i];
       smallest_index = i;
     }
   }
   return smallest_index;
 }

 public static int[] pop(int[] arr,int index)
 {
   int size = arr.Length - 1; 
   int[] newArr = new int[size];
   int n = 0;
   for(int i=0; i < arr.Length; i++)
   {
     if( i > newArr.Length-1)
     { 
     break;
     }
   if(i < index)
   {
      newArr[i] = arr[i];
   }
   else 
   {
     newArr[i] = arr[i+1];
   }
 }
 return newArr;
 }
}

解决方法

简短的版本是您通过强制它在固定(而不是动态)内存上操作来延迟选择排序。当您看到列出了复杂性的通用算法时,这与其说是承诺,不如说是指南。如果您不将数据结构与算法相匹配,您将无法达到相同的上限时间复杂度。

我看到作者没有考虑数组中弹出或元素删除步骤的时间复杂度,这也是 O(n)。

这表明您的输入没有正确组织。举一个更极端的例子,如果我坚持将我的列表存储在磁带上,数组访问是 O(n),因为我需要等待磁带在读头下假脱机。这并不意味着算法更复杂;这意味着该实现给算法设置了障碍。

在某些情况下,这可能是必要的约束。但是对于问题中的情况,您只需要一个不采用算法来删除和插入项目的数据结构,例如 List

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。