插入排序(direct Insert Sort)的基本思想是:顺序地将待排序的记录按其关键码的大小插入到已排序的记录子序列的适当位置。子序列的记录个数从1开始逐渐增大,当子序列的记录个数与顺序表中的记录个数相同时排序完毕。
设待排序的顺序表sqList中有n个记录,初始时子序列中只有一个记录sqList[0]。第一次排序时,准备把记录sqList[1]插入到已排好序的子序列中,这时只需要比较sqList[0]和sqList[1]的大小,若sqList[0]≤sqList[1],说明序列已有序,否则将sqList[1]插入到sqList[0]的前面,这样子序列的大小增大为2。第二次排序时,准备把记录sqList[2]插入到已排好序的子序列中,依次类推。
根据寻找插入位置的不同,插入排序可以有:直接插入和折半插入
1. 直接插入算法代码:
package sort.insert; /*** * 直接插入算法 * @author king */ public class InsertSort { //取一个数插入到有序序列中 private static void insertSort(int[] dataList ){ int count =1; for(int i=1;i< dataList.length;i++){ if(dataList[i] < dataList[i-1]){ int temp=dataList[i]; int j=0;//插入的位置 for(j=i-1;j>=0 && temp<dataList[j];--j){//用直接插入算法寻找可以插入的位置 dataList[j+1] = dataList[j]; } dataList[j+1]=temp; } System.out.println("第"+count+"趟排序:"); for(int k=0;k<dataList.length;k++){ System.out.print( dataList[k]+" "); } System.out.print("\n"); count++; } } public static void main(String[] args) { int[] dataList = new int[]{11,10,9,8,7,6,5,4,3,2,1}; insertSort(dataList); } }运行结果:
第1趟排序:
10 11 9 8 7 6 5 4 3 2 1
第2趟排序:
9 10 11 8 7 6 5 4 3 2 1
第3趟排序:
8 9 10 11 7 6 5 4 3 2 1
第4趟排序:
7 8 9 10 11 6 5 4 3 2 1
第5趟排序:
6 7 8 9 10 11 5 4 3 2 1
第6趟排序:
5 6 7 8 9 10 11 4 3 2 1
第7趟排序:
4 5 6 7 8 9 10 11 3 2 1
第8趟排序:
3 4 5 6 7 8 9 10 11 2 1
第9趟排序:
2 3 4 5 6 7 8 9 10 11 1
第10趟排序:
1 2 3 4 5 6 7 8 9 10 11
2. 折半插入算法代码
package sort.insert; /*** * 折半插入算法 * * @author king */ public class BinaryInsertSort { // 取一个数插入到有序序列中 private static void insertSort(int[] dataList) { int count = 1; for (int i = 1; i < dataList.length; i++) { if (dataList[i] < dataList[i - 1]) { int temp = dataList[i]; int j = 0;// 插入的位置 // 用折半插入的算法寻找可以插入的位置 int low = 0; int high = i - 1; int mid = 0; //二叉数查找到的插入位置 while (low <= high) { mid = (low + high) / 2; if (dataList[mid] > temp) { high = mid - 1; } else { low = mid + 1; } } j = mid;// 二叉数查找到的插入位置 // 移动换值 for (int k = i;k>j; k--) { dataList[k] = dataList[k - 1]; } dataList[j] = temp; } System.out.println("第" + count + "趟排序:"); for (int k = 0; k < dataList.length; k++) { System.out.print(dataList[k] + " "); } System.out.print("\n"); count++; } } public static void main(String[] args) { int[] dataList = new int[] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; insertSort(dataList); } }第1趟排序:
10 11 9 8 7 6 5 4 3 2 1
第2趟排序:
9 10 11 8 7 6 5 4 3 2 1
第3趟排序:
8 9 10 11 7 6 5 4 3 2 1
第4趟排序:
7 8 9 10 11 6 5 4 3 2 1
第5趟排序:
6 7 8 9 10 11 5 4 3 2 1
第6趟排序:
5 6 7 8 9 10 11 4 3 2 1
第7趟排序:
4 5 6 7 8 9 10 11 3 2 1
第8趟排序:
3 4 5 6 7 8 9 10 11 2 1
第9趟排序:
2 3 4 5 6 7 8 9 10 11 1
第10趟排序:
1 2 3 4 5 6 7 8 9 10 11
如果看每一趟的排序顺序,就大概明白了。
直接插入排序和折半插入排序都是
插入类排序类算法。
明天带来交换类排序算法:
起泡排序和快速排序。
相关推荐
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。这种排序方式在数据量小或者部分有序的情况下...
1. **数组操作**:插入排序通常基于数组或列表进行,C#中的数组和List提供了丰富的操作接口,如索引访问、长度获取等,便于我们进行排序。 2. **循环与条件判断**:插入排序的核心部分是两个嵌套的循环结构。外层...
本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...
1. **插入排序(Insertion Sort)** - 插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常整理扑克牌的过程。初始时,数组可以看作是未排序序列,已排序序列为空。每次从未排序序列中取出一个元素,...
减治法可以用于插入排序、拓扑排序、约瑟夫斯问题、图的深度优先和广度优先查找等问题。在插入排序中,减治法可以通过将数组分解成较小的子数组来实现排序。 插入排序算法描述: Insertion Sort(A[0..n-1]) ∥ ...
例如,对于1亿规模的数据,合并排序和快速排序将是更合适的选择,而选择排序、冒泡排序和插入排序则更适合小规模或部分有序的数据。在选择算法时,不仅要考虑时间复杂度,还需要考虑空间复杂度、稳定性、代码实现的...
排序-按键精灵-冒泡排序
直接插入排序(Straight Insertion Sort)是一种简单且古老的排序算法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。12 直接插入排序的算法过程如下: 假设待排序...
这里我们将深入探讨标题和描述中提到的六种排序算法:快速排序、归并排序、插入排序、冒泡排序、选择排序以及堆排序。 1. **快速排序**:由C.A.R. Hoare在1960年提出,是一种高效的分治算法。快速排序的基本思想是...
**空间复杂度**:由于插入排序是原地排序,不需要额外的存储空间,所以空间复杂度为O(1)。 在实际应用中,插入排序通常用于小规模数据或者作为其他高级排序算法(如快速排序、归并排序)的基石,特别是在处理部分...
- 插入排序是原地排序,不需要额外的存储空间,因此空间复杂度为O(1)。 6. **稳定性**: - 插入排序是稳定的排序算法,相同元素的相对位置不会改变。 7. **适用场景**: - 对于小规模数据或者部分有序的数据,...
数据结构第23讲-插入排序2和交换排序-CPPT课件.ppt
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列中间插入一个元素的复杂度为O(n)。 #### 实现细节 在Java代码中,`insertSort`方法通过两层循环实现:外层循环遍历每个...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
1. **插入排序的原理** - 插入排序的核心思想是分治法,它将数组分为已排序部分和未排序部分。初始时,已排序部分只有一个元素,即数组的第一个元素。 - 随后,每次从未排序部分选取一个元素,将其与已排序部分的...
4-3 插入排序可视化..mp4 4-4 在近乎有序的数据上测试插入排序算法...mp4 4-5 通过归并排序算法深入理解递归.mp4 4-6 归并排序算法可视化..mp4 4-7 快速排序算法可视化.mp4 4-8 在快速排序中随机选取标定点.mp4 4-9 ...
插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入...
插入排序是一种简单直观的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。根据插入方式的不同,插入排序有多种变体,其中直接插入排序是最常见的一种。 **...
7. **希尔排序**:由Donald Shell提出的改进版本的插入排序,通过设置不同的增量将待排序的序列分割成若干子序列,分别进行直接插入排序,然后逐步减小增量,直至增量为1,完成整个序列的排序。希尔排序的时间复杂度...