无序数组排序(时间复杂度为O(n))


好吧,这个是刚从别人那里看到的https://www.cnblogs.com/kubidemanong/p/10409712.html,学到了,先记下来。

问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。

对于数组来说,如果你是先把这 n 个数先排序,再打印,是不可能O(n)的时间打印出来的。但是数值范围在 0-20。我们就可以巧用数组下标了。把对应的数值作为数组下标,如果这个数出现过,则对应的数组加1

代码如下:

public void f(int arr[]) {
  int[] temp = new int[21];
  for (int i = 0; i < arr.length; i++) {
     temp[arr[i]]++;
  }
  //顺序打印
  for (int i = 0; i < 21; i++) {
     for (int j = 0; j < temp[i]; j++) {
       System.out.println(i);
     }
  }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM