经过一个假期对基础算法知识的学习,总算在近期告一段落,正好在刚开学的这一段冷却期,为了加深对算法的记忆与理解,准备对假期所学习的算法知识进行一定的总结与分析,算是对前一阶段所学知识的总结吧,也许在这期间还能发掘出当初没有想到的想法,算是很随性的总结吧,那么从今天开始,便由浅入深的对基本的算法进行一定的复习。
在这篇文章中将介绍一个非常简单的排序算法—插入排序算法(Insertionsort)。插入排序的算法的核心便在于原地排序。所谓原地排序指的是,在算法的运行过程中,在待排序对象的容器外仅仅有确定个数的对象。就像我们在桌子上放了一副扑克牌,我们想把每张牌按照牌上数字的大小按照非降序顺序排列之后堆叠在桌上,那么什么叫原地排序呢,我们把放牌堆的桌子认为是盛放牌的容器,我们的双手认为是牌堆之外的空间,我们在排序的过程中,每次仅仅在牌堆里面取得1张牌和牌堆里面的扑克牌进行比较后找到其应当所在的位置之后放回牌堆,然后再取下一张牌~~~如此反复,在算法的每一步在手中牌的数目是一定的,当然不一定非要是一张啦。这么做的好处便是能够有效的节省内存的占用,如果系统的内存资源紧张,这么做的意义是非常明显的。
那么我们首先对算法的具体步骤进行介绍,该算法的代码实现如下:
public class InsertionsortTest {
/**
* 插入排序算法实现
*
* @param tempNumbers 待排序数组
* @return
*/
public static int[] insertionSort(int[] tempNumbers){
for(int index = 1; index < tempNumbers.length; index++){//从待排序数组第二个元素开始向前作比较
int target = tempNumbers[index];//取得目标元素
int targetIndex = index - 1;//待比较元素初始化位目标元素前一个
while(targetIndex >= 0 && target < tempNumbers[targetIndex]){//当待比较元素未越界且待比较元素大于目标元素
tempNumbers[targetIndex + 1] = tempNumbers[targetIndex];//将待比较元素向后移动一位
targetIndex --;//把前一个元素作为下一个待比较元素
}
tempNumbers[targetIndex + 1] = target;//当待比较元素小于目标元素时,讲目标元素插入至待比较元素之后
}
return tempNumbers;//返回已排列好的数组
}
/**
* @param args
*/
public static void main(String[] args) {
int[] tempNumbers = {4,1,7,13,11,57,14,6,58};
int[] targetNumbers = InsertionsortTest.insertionSort(tempNumbers);
System.out.println(Arrays.toString(targetNumbers));
}
}
算法的运行过程很简单,具体步骤的意义已经在注释中进行了解释,总体的运行过程就像给扑克排序一样,把元素容器的第二个元素开始的元素作为目标元素,把目标元素与之前的元素进行比较,把之前的元素作为待比较元素若待比较元素大于目标元素便把待比较元素后移一位,并把它原来的前一个元素作为新的待比较元素,直到待比较元素小于目标元素,便把目标元素插入至待比较元素之后。在算法的整个过程中在元素容器之外的元素只有一个当前的目标元素,因此这种排序方法是原地的,能够有效的节省内存的使用。
然而这种算法也有其缺点,那就是只适合小规模数据的排序,对于大规模数据的排序效率便不令人满意了,因为其时间复杂度是O(n2)级别的,既然是n方级别的,那么随着输入数据数量级的增长,其排序所需时间的增长过于巨大,效率不能令人满意。在处理小规模数据的过程中效率还是可观的,因此,有人的想法便是利用分治法将大规模的数据分解成小规模的数据集,进行排序之后再进行排序。
虽说算法的效率不算太高,不过毕竟是入门算法,而且实现简单,在平时数据量很小时还是能很好的解决问题的,至于比较高效的算法,实现复杂度也会相应的提高,那么我们应该在以后的文章中能够见到。
分享到:
相关推荐
讲义可能包含了各种经典的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序,以及更高效的排序算法如计数排序、桶排序、基数排序等。还会讨论各种算法的时间复杂度和稳定性。 4. **查找算法*...
**直接插入排序**和**直接选择排序**是两种基础的排序算法。直接插入排序将每个元素逐个插入到已排序的序列中,而直接选择排序则是每次都找到未排序部分的最小(或最大)元素,然后放到正确的位置。 这些排序算法各...
第四章涉及插入排序和拓扑排序,前者是基于比较的排序算法,后者则用于无环有向图的排序。计算中值和选择问题是数据处理中的重要任务,它们为决策和统计分析提供基础。 第五章包含了两种高效的排序算法——合并排序...
1. 排序算法:复习冒泡排序、选择排序、插入排序、快速排序、归并排序等,理解其工作原理和效率。 2. 搜索算法:深度优先搜索(DFS)与广度优先搜索(BFS)的应用及其在图论中的角色。 3. 动态规划:理解状态转移...
在这里,学习者将通过实际的编程例子来应用前面所学的理论知识,例如排序算法(冒泡排序、选择排序、插入排序等)、查找算法(线性查找、二分查找等)以及一些经典的算法问题,如最短路径问题、最小生成树问题等。...
插入排序法 程序设计:哈希表的一个应用 多维数组下标操作符重载一法 汉诺塔的非递归 回朔法一例 几道有趣的算法题 阶梯问题的递归解法 精确迭代法 矩阵求逆的快速算法 快 速 排 序 马踏棋盘问题 冒 泡 法 排序算法 ...
插入排序法 程序设计:哈希表的一个应用 多维数组下标操作符重载一法 汉诺塔的非递归 回朔法一例 几道有趣的算法题 阶梯问题的递归解法 精确迭代法 矩阵求逆的快速算法 快 速 排 序 马踏棋盘问题 冒 泡 法 排序算法 ...
2. **排序与搜索算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等经典排序算法的原理、实现和复杂度分析。搜索算法如二分查找、哈希查找也是重点。 3. **分治策略**:如归并排序、快速排序...
《算法设计与分析复习资料》是一份针对计算机科学与信息技术领域的核心课程——算法设计与分析的复习资源。这份资料旨在帮助学习者系统地理解和掌握算法的基本概念、设计方法以及性能分析,为应对相关考试或提升编程...
排序是调整数据顺序的过程,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序。查找则是寻找特定元素,如线性查找、二分查找和哈希查找。复习题可能要求分析不同算法的时间复杂度和空间...
6. **排序与查找**:排序是将一组数据按照特定顺序排列的过程,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。查找是寻找特定元素的过程,如线性查找、二分查找、哈希查找等。理解各种排序算法的时间...
☆ 插入排序法 ☆ 程序设计:哈希表的一个应用 ☆ 多维数组下标操作符重载一法 ☆ 汉诺塔的非递归 ☆ 何谓数据结构 ☆ 回朔法一例 ☆ 几道有趣的算法题 ☆ 阶梯问题的递归解法 ☆ 精确迭代法 ☆ 矩阵求逆的快速算法 ...
在顺序表中,我们学习了查找和排序算法,如二分查找、快速排序等。链表则涉及单链表、循环链表和链串,以及多项式处理、归并和箱子排序等问题。堆栈和队列在存储和运算上的特性被详细阐述,循环队列的空满判断和基数...
排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等,用于将数据按特定顺序排列。 8. **算法设计的目标**:设计一个好的算法应该考虑以下几个方面:正确性(确保算法逻辑无误)、可读性(便于...
在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在编程语言如Java中。这个名为"Java经典排序"的项目显然旨在提供一系列经典的排序算法实现,以供学习和实践。以下是对这些排序算法的详细介绍: 1. *...
六种排序算法(直接插入、希尔、冒泡、快速、直接选择、归并)是本章的重点,其中快速排序和归并排序的时间复杂度分析需要进一步理解。 第三章“链表及其应用”涉及线性逻辑结构在链式存储下的数据结构——链表。...
一、 基础知识和算法 7 1. 线性表及其特点 7 2. 顺序表——线性表的顺序存储结构 7 3. 单链表——线性表的链式存储结构之一 10 4. 循环链表 15 5. 双向循环链表 15 6. 顺序表与单链表的比较 16 二、 习题 16 第3章 ...
本资料包“计算机基础课程——数据结构的试题”是针对计算机类专业基础课和热门选修课的数据结构考试所编纂的一套试题集,非常适合学生进行自我检测和复习。 数据结构主要包括以下几个重要概念: 1. **数组**:最...