近来想重新研究并实践一下大学时候学的的算法和数据结构,于是下了本《Introduction to Algorithms》作为参考书。因为原来理论基本上都学过了,但是实践的比较少,所以打算对某个topic先动手写写看能不能用程序实现出来,并对程序做一定的时间空间效率分析,接下来再参考书上是如何研究分析和改进一个算法的。废话少说,第一个topic:Insertion Sort
public class InsertionSort
{
public static void main(String[] args) {
int[] data = {32, 24, 25, 324, 30, 23, 233, 34, 233};
insertionSort(data);
}
/**
*Insertion Sort in ascending order.
*/
public static void insertionSort(int[] data){
if(data == null) {
return;
}
int temp;
for(int i = 1; i < data.length; i++) {
temp = data[i];
for(int j = i - 1; j >= 0 && temp < data[j]; j--) {
data[j+1] = data[j];
data[j] = temp;
print(data, i);
print(data, data.length - 1);
System.out.println();
}
}
}
/**
* Print out the array with index less than the specified bound.
*/
public static void print(int[] data, int bound) {
for( int i = 0; i <= bound; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
}
}
排序过程及结果:
24 32
24 32 25 324 30 23 233 34 233
24 25 32
24 25 32 324 30 23 233 34 233
24 25 32 30 324
24 25 32 30 324 23 233 34 233
24 25 30 32 324
24 25 30 32 324 23 233 34 233
24 25 30 32 23 324
24 25 30 32 23 324 233 34 233
24 25 30 23 32 324
24 25 30 23 32 324 233 34 233
24 25 23 30 32 324
24 25 23 30 32 324 233 34 233
24 23 25 30 32 324
24 23 25 30 32 324 233 34 233
23 24 25 30 32 324
23 24 25 30 32 324 233 34 233
23 24 25 30 32 233 324
23 24 25 30 32 233 324 34 233
23 24 25 30 32 233 34 324
23 24 25 30 32 233 34 324 233
23 24 25 30 32 34 233 324
23 24 25 30 32 34 233 324 233
23 24 25 30 32 34 233 233 324
23 24 25 30 32 34 233 233 324
插入排序的原理就是:当前元素从后往前查找到升比自己小(序)或比自己大(降序)的元素,在查找过程中的同时还要将前一个元素向后一个元素的位置移动,所以当前的元素的值会被冲掉,因此要先将其保存在temp里面。
时空效率分析:
空间:进行排序动作时,需要一个额外的临时变量用来保存当前元素
时间复杂度:1 + 2 + ........n-1 ( n >= 1) = (n-1 + 1)(n-1)/2 = (n^2 - n)/2,即为O(n^2)
附:考虑到概率问题,当前元素data[i] 与data[1..i-1]平均需要i/2次比较,故实际比较次数应为1/2 + 2/2 + ............(n-1)/2 ( n >= 1) = (n^2-n)/4
以上程序只选择int类型作为处理数据,考虑到通用性,可以通过传入一个Comparator实现类来对所有的类型进行排序。
import java.util.Comparator;
class IntComparator implements Comparator
{
public int compare(Object obj1, Object obj2) {
Integer num1 = (Integer)obj1;
Integer num2 = (Integer)obj2;
return num1 - num2;
}
/**
*To determine that two distinct Comparators impose the same order thus improve the performance in some cases.
*/
public boolean equals(Object obj) {
if( this == obj ) {
return true;
}
if(!(obj instanceof IntComparator) ){
return false;
}
return false;
}
}
import java.util.Comparator;
public class GenericInsertionSort
{
public static void main(String[] args) {
Integer[] data = {32, 23, 3234, 324, 343};
insertionSort(data, new IntComparator());
for(int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
public static <T> void insertionSort(T[] data, Comparator comparator) {
if(data == null) {
return;
}
int length = data.length;
for( int i = 1; i < length; i++ ) {
T temp = data[i];
for(int j = i - 1; j >= 0 && comparator.compare(temp, data[j]) < 0; j--) {
data[j+1] = data[j];
data[j] = temp;
}
}
}
}
这样,就可以对任何类型进行排序了,这时需要传入一个实现了Comparator接口的比较类。比如想结合员工的工龄和工资进行排序,在Compartor方法里实现想要的逻辑就行了。
分享到:
相关推荐
《算法数据结构学习笔记-C语言》是一份专为新手设计的C语言学习资源,它将带你深入探索C语言的世界,并逐步掌握算法与数据结构的基本概念和应用。在C语言这个强大的编程工具下,理解并运用算法和数据结构是提升编程...
"数据结构看书笔记---lazyfennec整理精选"是一份由lazyfennec精心整理的数据结构学习资料,旨在帮助学习者深入理解并掌握这一领域的重要概念和算法。 笔记可能涵盖了以下几个关键知识点: 1. **数组**:数组是最...
这本"算法与数据结构学习笔记"涵盖了这两个核心概念的详细讲解,对于任何想要深入理解计算机科学原理、提高编程技能的人来说,都是一份宝贵的资源。 算法,简单来说,就是解决特定问题的步骤或指令集。它在计算机...
"算法与数据结构笔记-PKU1" 本资源是《算法与数据结构》笔记的摘要信息,...《算法与数据结构》笔记涵盖了数据结构和算法的基本概念、主要数据结构、存储结构、算法等内容,对于学习算法和数据结构的学生非常有帮助。
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
4. **排序与查找**:排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等,它们的时间复杂性和适用场景是考察的重点。查找算法如顺序查找、二分查找、哈希表查找等也会被详细讨论。 5. **动态...
1. **排序算法**:如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,以及它们的时间复杂度和空间复杂度分析。 2. **查找算法**:包括顺序查找、二分查找、哈希查找等,以及在不同数据结构中的应用。...
### Java数据结构与算法——学习笔记 #### 一、引言 在计算机科学领域,**数据结构**与**算法**是两个极其重要的概念。数据结构指的是数据的组织方式,而算法则是解决特定问题的一系列步骤。这两者是编程的基础,...
这份由lazyfennec精心整理的"数据结构看书笔记"涵盖了数据结构的主要内容,对于复习或学习这个主题非常有帮助。 一、线性结构 线性结构是最基础的数据结构,包括数组、链表和队列等。数组是一种静态存储结构,元素...
在“算法和数据结构学习笔记.zip”这个压缩包中,很可能包含了丰富的资源,帮助大学生深入理解和掌握这一重要领域。 数据结构的学习通常分为几个关键部分: 1. **线性数据结构**:如数组、链表、栈和队列。数组是...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
这份“数据结构与算法分析学习笔记”由罗聪编著,包含了丰富的源代码实例,旨在帮助读者深入理解并掌握这些关键概念。 数据结构是组织和管理数据的方式,它包括数组、链表、栈、队列、树、图等。数组是最基本的数据...
这份"数据结构与算法学习笔记"涵盖了这一领域的核心概念,特别强调了C++模板类的实现,这使得理论知识可以直接应用于实际项目。 首先,我们要了解数据结构。数据结构是组织、存储和管理数据的方式,包括数组、链表...