【发布时间】:2021-06-29 14:12:36
【问题描述】:
我遇到了下面实现排序数组的代码。
我已经申请了一个很长的数组,它能够在一秒内完成,可能是 20 毫秒或更短。
我一直在阅读有关算法复杂性和大 O 表示法的文章,并想知道:
- 在此代码中实现的(现有的)排序方法是什么。
- 这里使用的算法的复杂度是多少。
- 如果你要改进下面的算法/代码,你会改变什么。
using System;
using System.Text;
//This program sorts an array
public class SortArray
{
static void Main(String []args)
{
// declaring and initializing the array
//int[] arr = new int[] {3,1,4,5,7,2,6,1, 9,11, 7, 2,5,8,4};
int[] arr = new int[] {489,491,493,495,497,529,531,533,535,369,507,509,511,513,515,203,205,207,209,211,213,107,109,111,113,115,117,11913,415,417,419,421,423,425,427,15,17,19,21,4,517,519,521,523,525,527,4,39,441,443,445,447,449,451,453,455,457,459,461,537,539,541,543,545,547,1,3,5,7,9,11,13,463,465,467,23,399,401,403,405,407,409,411,499,501,503,505,333,335,337,339,341,343,345,347,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,9,171,173,175,177,179,181,183,185,187,269,271,273,275,277,279,281,283,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,133,135,137,139,141,143,145,285,287,289,291,121,123,125,127,129,131,297,299,373,375,377,379,381,383,385,387,389,97,99,101,103,105,147,149,151,153,155,157,159,161,163,165,167,16,391,393,395,397,399,401,403,189,191,193,195,197,199,201,247,249,251,253,255,257,259,261,263,265,267,343,345,347,349,501,503,505,333,335,337,339,341,417,419,421,423,425,561,563,565,567,569,571,573,587,589,591,593,595,597,599,427,429,431,433,301,303,305,307,309,311,313,315,317,319,321,323,325,327,329,331,371,359,361,363,365,367,369,507,509,511,513,515,351,353,355,57,517,519,521,523,525,527,413,415,405,407,409,411,499,435,437,469,471,473,475,477,479,481,483,485,487,545,547,549,551,553,555,575,577,579,581,583,585,557,559,489,491,493,495,497,529,531,533,535,537,539,541,543,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,293,295};
int temp;
// traverse 0 to array length
for (int i = 0; i < arr.Length ; i++)
{
// traverse i+1 to array length
//for (int j = i + 1; j < arr.Length; j++)
for (int j = i+1; j < arr.Length; j++)
{
// compare array element with
// all next element
if (arr[i] > arr[j]) {
///Console.WriteLine(i+"i before"+arr[i]);
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
//Console.WriteLine("i After"+arr[i]);
}
}
}
// print all element of array
foreach(int value in arr)
{
Console.Write(value + " ");
}
}
}
【问题讨论】:
-
选择排序 - O(N^2) - 还有很多其他选项。我可以通过快速的谷歌搜索找到这个,请在作为问题发布之前尝试研究一些东西 - Big O Cheat Sheet
-
在学习的时候,这种代码就可以了。当你完成任务时,你应该使用
Array.Sort(arr);。微软聘请了真正了解复杂性的精英计算机科学家,并让他们花费大量时间为我们这些凡人尽快完成这类事情。 -
如果您打算成为 Microsoft、Google 或 Amazon 团队的一员,他们要求您了解的不仅仅是基础知识和使用 array.sort (arrayx)....
-
在讨论排序算法时,“非常长的数组”是一个包含超过一百万个元素的数组。问题中的数组很小。
-
我能够创建一个很长的数组并增加了代码的时间。排序花了 40 秒。现在我可以使用其他方法创建代码并进行比较。