数据结构(四十四)插入排序(1.直接插入排序 2.希尔排序)
Posted bigjunoba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(四十四)插入排序(1.直接插入排序 2.希尔排序)相关的知识,希望对你有一定的参考价值。
一、插入排序的基本思想
从初始有序的子集合开始,不断地把新的数据元素插入到已排列有序子集合的合适位置上,使子集合中数据元素的个数不断增多,当子集合等于集合时,插入排序算法结束。常用的 插入排序算法有直接插入排序和希尔排序两种。
二、直接插入排序
1.直接插入排序的定义
直接插入排序的基本思想是:顺序地把待排序的数据元素按其值的大小插入到已排序数据元素子集合的适当位置。子集合的数据元素个数从只有一个数据元素开始逐次增大。当子集合大小最终和集合大小相同时排序完毕。
2.直接插入排序的实现
public static void straightInsertionSort(int[] L) { int i, j, temp; for (i = 0; i < L.length - 1; i++) { temp = L[i+1]; // 保存要插入的数据元素 j = i; while (j > -1 && temp <= L[j]) { // 将temp插入到原数组集合中 L[j+1] = L[j]; j--; } L[j+1] = temp; } }
int[] array1 = {9,1,5,8,3,7,4,6,2};
初始时,子集合中L0已经排好序,即为{9}
i=0时,temp=L1=1,j=0,0大于-1且1小于9,则L1=9,j=-1,L0=1,即将1插入到9的前面,集合中{1,9}
i=1时,temp=L2=5,j=1,1大于-1且5小于9,则L2=9,j=0,0大于-1但5不小于1,则L1=5,集合中{1,5,9}
i=2时,temp=L3=8,即将8和9比较,8插入到9的前面,8和5比较,不动,8和1比较,也不动,集合中{1,5,8,9}
...
3.直接插入排序的性能分析
(1)时间复杂度为O(n2)
- 最好情况是原始数据集合已经全部排好序。这时内层while循环的循环次数每次均为0,外层for循环中每次数据元素的比较次数均为1,数据元素的赋值语句执行次数均为2。因此整个排序过程中比较次数为n-1,移动次数为2(n-1),此时的时间复杂度为O(n)。
- 最坏情况是与原始数据集合反序排列。这时内层while循环的循环次数每次均为i,这样,整个外层for循环中的比较次数为(1+1)+(2+1)+...+(n-1+1)=(n-1)(n+2)/2,而移动次数为(1+2)+(2+2)+...+(n-1+2)=(n-1)(n+4)/2。此时的时间复杂度为O(n2)。
- 随机情况是数据集合中大小的排列是随机的。这时比较次数的期望和移动次数的期望均为n2/4,此时的时间复杂度为O(n2)。
(2)空间复杂度为O(1)。
(3)是一种稳定的排序算法。
三、希尔排序
1.希尔排序的定义
希尔排序的基本思想是:把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小;当完成了所有数据元素都在一个组内的排序后排序过程结束。希尔排序又称作缩小增量排序。
在直接插入排序算法的性能分析中可以得出结论:原始数据集合越接近有序,直接插入排序算法的时间效率越高,其时间效率在O(n)~O(n2)之间。这个结论是希尔排序算法能够成立的基础。希尔排序算法把待排序数据元素分成若干小组,在小组内用直接插入排序算法排序,当把若干个小组合并为一个小组时,组中的数据元素集合将会接近有序,这样各组内的直接插入排序算法的时间效率就很好,最终整个希尔排序的时间效率就很高。
以上是关于数据结构(四十四)插入排序(1.直接插入排序 2.希尔排序)的主要内容,如果未能解决你的问题,请参考以下文章