`
superloafer
  • 浏览: 167827 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

算法数据结构学习笔记-插入排序

阅读更多
近来想重新研究并实践一下大学时候学的的算法和数据结构,于是下了本《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方法里实现想要的逻辑就行了。
分享到:
评论

相关推荐

    数据结构与算法-学习笔记 Java 版.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    Java数据结构与算法学习笔记之排序

    Java数据结构与算法学习笔记之排序 冒泡排序,选择排序,插入排序,希尔排序, 归并排序, 快速排序.

    算法和数据结构学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    数据结构算法学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    数据结构与算法学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    数据结构与算法的学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    Data Structures and Algorithms 数据结构与算法学习笔记.zip

    算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    记录 — 数据结构与算法笔记.zip

    算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): ...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    尚硅谷老韩java版算法和数据结构讲解代码笔记整理.zip

    算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): ...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    Java 学习笔记,包括多线程,数据结构,算法,设计模式,Spring boot,RocketMQ.zip

    算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    《数据结构与算法分析 java语言描述》 读书笔记.zip

    算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    Android 工程师成长之路:JAVA算法的实现,数据结构 和 Android源码笔记等 分享.zip

    算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    leetcode中文版-Algorithms-Learning-Python:我学习算法的过程中编写的代码和笔记(Python实现)

    本代码仓库是我学习“算法与数据结构”的过程中,对于一些经典算法和数据结构的实现,同时我还写了 Java 版本。 文章标题 文章链接 Python 代码链接 Java 代码链接 【算法日积月累】0-写在前面的话 第 1 部分:排序...

    我的算法:我的数据结构和算法学习笔记

    我的算法我的算法学习笔记数据结构叠放队列链表BinarySearchTree 组地图eep 段树特里联合查找AVL树红黑树哈希表图形演算法分类气泡分选选择排序插入排序贝壳分类快速分类合并排序堆排序计数排序桶分类基数排序搜索二...

    algorithm:数据结构|数组队列堆栈链表哈希表堆字典树;算法|排序贪心动态规划分治回溯;欢迎给建议~~

    前言 本人平时学习及收集内容,欢迎参入一起讨论。 关于作者 ...算法学习笔记 JavaScript 实现的算法和数据结构 数据结构和算法必知必会的 50 个代码实现 All Algorithms implemented in Python 降维

    高级java笔试题-Lookoop:学习笔记

    数据结构与一些算法,来自算法导论,数据结构与算法分析-C语言描述,C Primer Plus, 数据结构-python描述,博客 ADT链表(c)-抽象链表实现 geometry(c++)-Andrew's Monotone Chain Algorithm Graph (python)-拓扑...

    leetcode有效期-LeetCode-practice:LeetCode练习代码、数据结构,以及使用swift的常用排序算法

    初步的计划是先实现一些基础的也是应用最多的排序算法,然后在刷leetcode的过程中遇到数据结构,动手实现一些,数据结构是单独实现,没有相互嵌套和复用,主要是给自己做一个笔记,所有代码都是使用swift实现。...

    leetcode迷宫问题-Algorithm:算法学习笔记

    算法学习笔记 记录内容包括《算法4》学习编写的 demo,和 leetcode 习题笔记。 基础目标: 基础数据结构相关:链表、栈和队列的实现 排序算法相关:时间复杂度为 O(n²) 的系列排序算法如 选择、插入和优化的希尔等...

    leetcode中国-CS-CheatSheet:算法和数据结构

    插入排序 希尔排序 堆排序 归并排序 快速排序 图算法 广度优先搜索 深度优先搜索 拓扑排序 五种经典算法 分治法 动态规划 回溯法 分支界限法 贪心算法 其他算法 数据结构 设计模式 创建型模式 结构型模式 行为型模式...

    leetcode卡-algorithm_notes:算法学习笔记

    数据结构 线性表 顺序表 链表 单链表 双(向)链表 循环链表 单(向)循环链表 双(向)循环链表 堆栈 顺序栈 链栈 队列 顺序队列 顺序循环队列 链队 数组 一维数组 多维数组 矩阵的压缩存储 广义表 树 存储实现 二叉树 ...

Global site tag (gtag.js) - Google Analytics