前沿:
如果需要了解简单排序中的冒泡排序和选择排序,请查看一下连接:
冒泡排序 点击这里
选择排序 点击这里
介绍:
在大多数情况下,插入排序算法是基本排序算法中最好的一种。虽然插入排序算法仍然需要O(N*N)的时间,但是在一般情况下,要比冒泡排序快一倍,甚至比选择排序还快一些。然而,并不是什么情况下插入排序算法的效率都是最好的。比如一个极端的情况:对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不必冒泡排序快。因此,在选择这些算法的时候,要根据实际情况酌情处理才是上策。
思路:
把N个待排序的数据项看成一个有序部分和一个无序部分。开始的时候有序部分只有一个数据项(亦即第一个数据项,数组中下标为0的位置),无序部分中有N-1个数据项(除开数组中第一个数据项之外的其他数据项)。排序过程中每次从无序部分取出第一个元素,在有序部分中找到合适的位置将这个新取出的数据项放在该处,使之成为有序部分的一个数据项。经过这一次之后,有序部分多了一个数据项而无序部分少了一个数据项,以此类推,就可以实现序列的有序性。
核心代码:
public void insertSort() {
int innerLoop,outterLoop;
for(outterLoop=1;outterLoop<elementCount;outterLoop++) {
double temp = array[outterLoop];
innerLoop = outterLoop;
while(innerLoop>0 && array[innerLoop-1]>=temp) {
array[innerLoop] = array[innerLoop-1];
innerLoop--;
}//end of while
array[innerLoop] = temp;
}//end of for
}//end of method insertSort()
核心代码说明:
外层的for循环中,outterLoop变量从1开始,向右移动。这是因为已经假设第一个数组就是有序的部分了。内层的while循环中,innerLoop变量从outterLoop变量开始,向左移动,直到temp变量小于innerLoop所指的数据项,或者它已经不能再往左移动为止。while循环中的每一趟都向右移动了一个已排序的数据项。
完整代码:
package barry.sort.insertsort;
public class InsertSorter {
private double[] array;
private int elementCount;
public InsertSorter(int size) {
array = new double[size];
elementCount = 0;
}// end of constructor
public void insert(double value) {
array[elementCount++] = value;
}// end of method insert()
public void display() {
for (int i = 0; i < elementCount; i++) {
System.out.print(array[i] + "\t");
}// end of for
}// end of method display()
public void insertSort() {
int innerLoop,outterLoop;
for(outterLoop=1;outterLoop<elementCount;outterLoop++) {
double temp = array[outterLoop];
innerLoop = outterLoop;
while(innerLoop>0 && array[innerLoop-1]>=temp) {
array[innerLoop] = array[innerLoop-1];
innerLoop--;
}//end of while
array[innerLoop] = temp;
}//end of for
}//end of method insertSort()
}// end of class
package barry.sort.insertsort;
public class InsertSorterApp {
public static void main(String[] args) {
InsertSorter sorter = new InsertSorter(10);
sorter.insert(-10);sorter.insert(56);
sorter.insert(23);sorter.insert(8723);
sorter.insert(-90);sorter.insert(993);
sorter.insert(33);sorter.insert(-373);
//display them before sort
System.out.println("\nBefore Sort:");
sorter.display();
//sort them
sorter.insertSort();
//display tem after sort
System.out.println("\nAfter Sort:");
sorter.display();
}//end of main
}//end of class
运行结果:
Before Sort:
-10.0 56.0 23.0 8723.0 -90.0 993.0 33.0 -373.0
After Sort:
-373.0 -90.0 -10.0 23.0 33.0 56.0 993.0 8723.0
总结:
以上的过程我们发现插入排序很简单,但是效率如何呢?首先从空间来看,它只需要一个元素的辅助空间,用于元素的位置交换。从时间分析,首先外层循环要进行n-1次插入,每次插入最少比较一次(正序),移动两次;最多比较i次,移动i+2次(逆序)(i=1,2,…,n-1)。因此,插入排序的时间复杂度为O(N*N)。目前为止我们看到的三种排序算法,时间复杂度都是一样的,但是由于需要的交换次数和空间大小不同,因此实际过程中我们应该有选择性的去使用。
分享到:
相关推荐
排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序等,解决如何将无序数据变为有序的问题;查找算法如线性查找、二分查找,用于定位数据;图算法如深度优先搜索(DFS)和广度优先搜索(BFS),用于遍历图...
数据结构与算法是计算机科学的基础,对于任何编程学习者来说,理解和掌握它们至关重要。这个“数据结构与算法-----PPT版本”很可能包含了徐旭松教授或专家精心制作的一系列教学材料,旨在帮助学习者深入理解这些核心...
在《数据结构算法与应用--C++语言描述》这本书中,作者深入浅出地介绍了各种基本和高级的数据结构及其对应的算法,并提供了详细的C++实现。以下是基于这个主题的详细知识点讲解: 1. **数组**:数组是最基础的数据...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
- 冒泡排序、选择排序和插入排序的基本思想及时间复杂度分析。 - 希尔排序(Shell Sort)的改进方法。 - 快速排序的分治策略及递归实现。 - **高级排序算法**: - 归并排序的合并策略及稳定性分析。 - 堆排序的...
"数据结构--排序--思维导图" 数据结构中排序是指将一组无序的记录序列按照一定的规则排列成有序的序列,排序的目的是为了提高数据的存储和检索效率。排序算法的稳定性是指在排序过程中,如果待排序表中有两个元素Ri...
常见的算法有排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序)、搜索(如线性搜索、二分搜索)、图算法(如深度优先搜索DFS、广度优先搜索BFS、最短路径算法Dijkstra、Floyd-Warshall)等。理解和掌握...
- **排序算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,它们用于将一组数据按照特定顺序排列。 - **查找算法**:如线性查找、二分查找、哈希查找,用于在数据集中寻找特定元素。 - *...
- **八大排序算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序、希尔排序和计数排序。每种算法都有其特定的应用场景和效率特点。 4. **查找算法**: - **哈希表**:通过哈希函数快速定位...
常见算法包括排序(如冒泡排序、插入排序、快速排序和归并排序)、查找(如线性查找、二分查找和哈希查找)以及图算法(如深度优先搜索和广度优先搜索)。通过动画演示,这些抽象的概念可以变得生动形象,帮助初学者...
在编程竞赛、数据结构与算法的学习中,选择排序是一个基础概念,有助于理解排序算法的基本原理。在实际编程中,尽管选择排序并不常用,但对于学习者来说,它是理解其他更高效排序算法(如快速排序和归并排序)的良好...
本资料包“数据结构与算法-C语言版本”聚焦于通过源码实例和答案解析,帮助学习者深入理解数据结构的原理和算法的应用。 1. **数据结构**: - **线性结构**:如数组和链表,是数据元素间存在一对一关系的结构。...
- 定义了数据结构的基本概念,解释了为何学习数据结构与算法的重要性。 - 介绍了数据结构的分类,如线性结构、树形结构、图结构和散列结构等。 - 讨论了算法分析的基础,包括时间复杂度和空间复杂度的概念。 2. ...
《数据结构算法与应用--C++语言描述》是一本深入探讨数据结构和算法的书籍,其源代码由学习者精心整理并优化,便于理解和实践。这个压缩包包含了多个章节的练习代码,每个文件都按照“章_节_编号”的规则进行命名,...
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...