插入排序好比抓牌,一副牌是待排序的数组,拿一张牌,跟手里的牌从右到左一张张比较,插入到合适的位置。
优点:适应小数据量排序,空间消耗小。
缺点:当数据量比较大时,排序效率不高。
代码结构:
Sort:排序接口
AbstractSort:排序抽象类
InsertSort:排序算法。
Sort:
public interface Sort<T> {
/**
* 返回排序后的数组
* @return
*/
public T[] sort(T[] array);
public T[] sort();
}
AbstractSort:
import java.util.Arrays;
import java.util.Comparator;
public abstract class AbstractSort<T> implements Sort<T> {
/**
* 待排序数组
*/
protected T[] array;
/**
* 用于比较数组元素大小
*/
protected Comparator<? super T> comp;
public void init(T[] array,Comparator<? super T> comp){
this.array = array;
this.comp = comp;
}
public void print(){
System.out.println(Arrays.toString(array));
}
public void swap(int i ,int j){
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
InsertSort:
import java.util.Arrays;
import java.util.Comparator;
public class InsertSort<T> extends AbstractSort<T> {
public InsertSort(T[] array, Comparator<? super T> comp) {
init(array, comp);
}
@Override
public T[] sort() {
T[] a = array;
return sort(a);
}
@Override
public T[] sort(T[] array) {
for (int i = 1; i < array.length; i++) {
T current = array[i];
int j = i - 1;
/*
* 如果array[j]前一个元素大于current,将array[j]移到下一个位置
*/
for (; j > -1 && comp.compare(current, array[j]) < 0; j--) {
array[j + 1] = array[j];
}
//将current设置到j+1位置
array[j + 1] = current;
}
return array;
}
@Override
public String toString() {
return "InsertSort";
}
public static void main(String[] args) {
Integer[] temp = null;
temp = new Integer[] { 16, 14, 8, 7, 9, 3, 2, 4, 1 };
Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
Sort<Integer> sort = new InsertSort<Integer>(temp, comp);
Integer[] clone = temp.clone();
Arrays.sort(clone);
boolean equals = Arrays.equals(clone, sort.sort());
assert equals;
System.out.println(Arrays.toString(temp));
}
}
分享到:
相关推荐
- 基本排序算法(如冒泡排序、插入排序) - **应用场景**:通过简单的排序算法理解算法的时间和空间效率。 **2. 第3章:函数的增长** - **主题简介**:讨论如何衡量算法的运行时间和空间需求,特别是大O记号、Ω...
3. **排序与搜索算法**:排序算法(如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序)和搜索算法(如线性搜索、二分搜索、哈希搜索)是算法的基础。书中详细分析了每种算法的工作原理、时间复杂度和...
通过上述章节内容的概述,我们可以看出,《算法导论——习题解答》不仅是一本配套教材的习题解答集,更是一部系统学习算法设计与分析的宝贵资源。通过深入浅出的讲解和丰富的习题解答,本书能够帮助读者建立起坚实的...
书中的001.PDF可能涵盖了基础的算法概念,如排序算法,比如冒泡排序、选择排序、插入排序、快速排序以及归并排序,这些都是算法初学者必须掌握的基础知识。002.PDF可能涉及更高级的排序算法,例如堆排序和希尔排序,...
#### 算法导论概览与重要性 《算法导论》是一本经典的计算机科学教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein共同编写。本书深入浅出地介绍了算法设计与分析的基本概念和...
描述部分指明了实验的目的和范围,要求对六种排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序、桶排序——进行实现并比较它们的性能。 #### 标签解读 标签“算法导论 排序算法”标明了该文档属于...
《MIT公开课——算法导论教材》是一份源自美国麻省理工学院(MIT)的珍贵教育资源,专注于教授计算机科学中的核心概念——算法。这份教材涵盖了排序、树和Hash等基础但至关重要的算法,对于学习和理解计算机科学的...
- **2.1 插入排序**:通过一个简单的例子介绍了一种基本的排序算法——插入排序。 - **2.2 分析算法**:探讨了如何评估算法的效率,包括时间复杂度和空间复杂度。 - **2.3 设计算法**:讨论了设计高效算法的基本...
例如,插入排序算法的分析就是一个很好的例子,它的时间复杂度为O(n^2),空间复杂度为O(1)。 3. **函数的增长率**:第三章讨论了函数增长率的概念,这是理解算法效率的关键。主要介绍了渐近表示法(如大O表示法、小...
- 基本排序算法(如插入排序)的实现和分析。 #### 第3章:函数的增长 - **主要内容**:讨论在算法分析中常见的函数增长速率的度量方法。 - **重点知识点**: - 大O表示法、Ω表示法、Θ表示法及其含义。 - ...
#### 算法导论(第2版)——习题答案 **知识点一:插入排序与归并排序的性能比较** 根据文档中的内容,“当\(8n^2 )时,插入排序优于归并排序”,即在特定条件下插入排序的效率高于归并排序。通过不等式的推导可以...
3. **排序算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,是算法中最基本且实用的部分。了解它们的工作原理、优缺点及适用场景对于优化代码至关重要。 4. **查找算法**:二分查找、哈希...
#### 算法导论-习题答案-含全部课后习题详细解答 **知识点概述:** 本资料为《算法导论》(第二版)一书的教师手册,提供了全书各章节课后习题的详细解答。该书由Thomas H. Cormen、Charles E. Leiserson、Ronald ...
此外,书中还提供了一个简单的算法实例——插入排序,并且从算法分析与算法设计两个维度展开讨论。这里涵盖了算法的效率、分析和设计的初步知识。重要的是,作者还讲解了函数增长、渐进记法(asymptotic notation)...
排序算法部分详细讲解了冒泡排序、插入排序、选择排序、快速排序、归并排序等多种方法,并分析了它们的时间复杂度和空间复杂度,帮助读者理解不同算法的效率差异。搜索算法则涉及二分查找、广度优先搜索和深度优先...
1. **排序算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。这些基本排序算法的理解和比较有助于我们了解不同情况下的最优选择。例如,快速排序在平均情况下具有较高的效率,而归并排序则...
《麻省理工学院-算法导论讲义》是一份深入探讨算法理论与实践的重要学习资料,源自世界顶级学府——麻省理工学院(MIT)。这份讲义涵盖了算法设计、分析和实现的关键概念,旨在帮助学生和专业人士理解如何高效地解决...