代码如下:
import java.util.BitSet;
import com.sun.java_cup.internal.internal_error;
public class Sort
{
private static boolean[] temp=new boolean[10000];
/**
* @notice 注意参数中的array数组中的每个元素大小不能超过9999,而且不能有重复元素。
* 同时也就意味着array数组大小不能超过10000,其中元素大小在0-9999的这样一个范围。
*/
public void sort(int[] array)
{
init();
for(int i=0;i<array.length;i++)
{
temp[array[i]]=true;
}
int loc=0;
for(int j=0;j<temp.length;j++)
{
if(temp[j])
array[loc++]=j;
}
}
private void init()//其实在此方法中通过传一个整数可以剪枝,而整数为array数组中元素的最大值
{
for(int i=0;i<temp.length;i++)
temp[i]=false;
}
public void print(int[] array)
{
for(int i=0;i<array.length;i++)
System.out.print(array[i]+" ");
System.out.println();
}
public static void main(String[] args)
{
Sort sort=new Sort();
int array[]=new int[]{3,5,1,2,10,88,25,66};
sort.print(array);
sort.sort(array);
sort.print(array);
}
}
*****************运行结果*****************
3 5 1 2 10 88 25 66
1 2 3 5 10 25 66 88
今天在看《编程珠玑》开始的时候,作者提到了位示图的数据结构,受其启发想到了这样一种排序方法,不过这种排序算法对传入的数组有着严格要求,不能重复,而且数组中元素的数值范围受辅助数组的大小的制约,但是此排序算法相对来说还是很快的,时间复杂度为O(n)。感觉美中不足的是貌似主流编程语言中没有提供一种bit的数据类型,不然会大大减小前边提到的元素数值范围所受的限制。本人还是一位刚入职的菜鸟,鉴于所学有限,不足之处望大家能多多指正。
分享到:
相关推荐
对于每个单独的段,由于其大小不超过sqrt(n),我们可以使用线性时间复杂度O(sqrt(n))的简单排序方法(如插入排序)来对它们进行排序。然后,我们开始自底向上的归并过程,将相邻的两个已排序的段合并。每次合并操作...
大O记法是一种表示算法时间复杂度的标准方式,它忽略了常数因子和低阶项的影响,关注的是随着输入规模增加时的增长率。 #### 二、推导大O阶方法 推导一个算法的时间复杂度,需要遵循一定的步骤。下面是推导大O阶的...
- 时间复杂度:快速排序的平均时间复杂度为O(n log n),但在最坏情况下(输入序列已排序或逆序)时间复杂度为O(n²)。通常,快速排序被认为是实际应用中最快的排序算法之一。 5. **插入排序(Insertion Sort)** ...
在最坏的情况下,堆排序的时间复杂度为O(n log n),而在最好的情况下,如数组已经部分有序,时间复杂度仍为O(n log n)。由于堆排序不需要额外的存储空间,因此它的空间复杂度为O(1)。 2. **归并排序**: 归并排序...
一种常见的选择是令k = n / log n,这样每个桶大约有log n个元素,桶内排序的时间复杂度可以看作是O(log n),而合并桶的时间复杂度仍然为O(n)。于是,总时间复杂度为: \[ T(\frac{n}{\log n}) = C \cdot \frac{n \...
插入排序的时间复杂度同样为O(n^2),但在最好的情况下(列表已排序),其时间复杂度为O(n)。插入排序也是稳定的,因为插入操作不会改变相等元素的相对顺序。 #### 3. 归并排序 归并排序采用分治策略,将列表分为两...
堆排序的时间复杂度为O(n log n),但相比其他O(n log n)算法,其常数因子较大。 7. 计数排序(Counting Sort) 计数排序是一种非基于比较的排序算法,适用于整数排序。它通过计算每个元素在待排序序列中出现的次数...
直接插入排序的时间复杂度为O(n^2),其中n是待排序元素的数量。这是因为对于每个待插入元素,都需要进行至多n-1次比较。直接插入排序的空间复杂度为O(1),因为它不需要额外的存储空间。此外,直接插入排序是稳定的,...
快速排序平均时间复杂度为O(n log n),最坏情况为O(n^2)。快速排序是不稳定的。 9. 希尔排序(Shell sort): 是插入排序的一种改进版,通过设置间隔序列,逐步减小间隔进行排序。希尔排序的时间复杂度取决于间隔...
- 最好情况:堆排序的最佳情况时间复杂度仍为 \(O(n\log n)\),这是因为堆排序的核心操作——调整堆的结构——的时间复杂度始终为 \(O(\log n)\)。 - 平均情况:堆排序的平均时间复杂度为 \(O(n\log n)\)。 - 最坏...
快速排序的平均时间复杂度为O(n log n),但在最坏情况下为O(n^2)。 归并排序则是利用分治法的典型应用,将大问题分解为小问题解决。它将数组分为两半,分别对左右两半进行排序,然后将两个有序的部分合并在一起。...
在最好情况下,即待排序的数据已经是有序的,选择排序仍会进行n(n-1)/2次比较,因此其最好情况时间复杂度为O(n^2)。在最坏情况下,即待排序的数据完全逆序,选择排序同样需要进行n(n-1)/2次比较,时间复杂度同样是O...
归并排序的时间复杂度总是O(n log n),但由于涉及到额外的空间开销,空间复杂度为O(n)。 6. 堆排序 (Heap Sort) 堆排序利用了完全二叉树的特性,将待排序序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素...
- **插入排序**:在最好情况下(当输入已经是排序好的)时间复杂度为O(n),但在最坏和平均情况下,时间复杂度均为O(n^2)。 - **选择排序**:无论是最好情况还是最坏情况,选择排序的时间复杂度都是O(n^2)。 - **堆...
- 时间复杂度为 O(d * (n + k)),其中 d 是最大数字的位数,n 是待排序元素的数量,k 是基数。 **稳定性**:基数排序是稳定的排序算法。 **应用场景**:适用于整数或字符串排序,特别是当待排序元素的范围较小且...
归并排序则提供了一种稳定且始终如一的O(n log n)时间复杂度,但需要更多的辅助空间。在实际应用中,选择哪种排序算法取决于具体的需求,例如是否需要稳定性、可用的内存资源以及预期的输入特性。 总的来说,快速...
它们不是基于比较的排序算法,因此在某些情况下能实现线性时间复杂度O(n)。 为了衡量这些算法的效率,我们通常使用时间复杂度作为评估标准。时间复杂度表示算法运行所需时间与输入规模之间的关系。在C++编程中,...
由于每次划分都是对半分,且每次合并的时间复杂度为O(n),所以合并排序的时间复杂度为O(n log n)。无论输入序列的初始顺序如何,合并排序都保持这个时间复杂度,具有较高的稳定性。 在实际应用中,冒泡排序由于其O...
- **插入排序**: 平均/最好/最坏时间复杂度分别为O(n^2)、O(n)、O(n^2),空间复杂度为O(1)。 - **希尔排序**: 平均/最坏时间复杂度介于O(nlogn)至O(n^2)之间,具体取决于增量序列的选择,空间复杂度为O(1)。 - **...