思路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zc72l5tw-1610468286438)(AD9015E404F44105AB92FB50917FA297)]
时间复杂度 O(n^2)
【实现1】
3 可否进行原地排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyeQv9aq-1610468286441)(86A4393B208E4DBD9842E78BFA1525A8)]
public static void sort(int[] data){
// arr[0..i)是有序的; arr[i..n)是无序的
for (int i = 0; i < data.length; i++) {
// 选择[i..n) 中的最小值的索引
int minIndex = i;
for (int j = i; j < data.length; j++) {
if(data[minIndex] >data[j]){
minIndex = j;
}
}
if(i != minIndex){
int temp = data[minIndex];
data[minIndex] = data[i];
data[i] = temp;
}
}
}
【实现2】
问题
- 1、要求适用于其他数据类型
- 2、泛型的比较不能使用 > 和 <
优化
- 1、使用泛型
- 2、使用自然排序接口 Comparable 或 定制排序接口 Comparator
- 2-1 如果使用Comparable接口,自定义类要实现Comparable接口 ,并重写comparaTO()方法
- 2-2 如果使用Comparable接口,泛型继承Comparable接口 --> 表明该类型是可比较的
public static <E extends Comparable<E>> void sort(E[] data){
for (int i = 0; i < data.length; i++) {
int minIndex = i;
for (int j = i; j < data.length; j++) {
if(data[j].compareTo(data[minIndex]) < 0){
minIndex = j;
}
}
if(i != minIndex){
E temp = data[minIndex];
data[minIndex] = data[i];
data[i] = temp;
}
}
}
验证时间复杂度 O(n^2)
public static void main(String[] args) {
int [] dataSize = {10000,100000};
for(int n:dataSize){
Integer[] data = ArrayGenerator.generateRandomArray(n,n*100);
long start = System.nanoTime();//纳秒
sort(data);
long end = System.nanoTime();
double time = (end-start)/1000000000.0;
System.out.println("n = "+ n + ":" + time + "s");
}
}
结果
时间2 是 时间1 的 100倍
n = 10000:0.0943812s
n = 100000:10.5438226s
博客围绕算法实现展开,介绍了两种实现方式,探讨了原地排序问题。针对实现中存在的问题进行优化,如使用泛型和排序接口。还对时间复杂度 O(n^2) 进行验证,结果显示时间 2 是时间 1 的 100 倍。

205

被折叠的 条评论
为什么被折叠?



