插入排序(Insertion Sort)算法简介:
插入排序是一种丛序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。
插入排序(Insertion Sort)算法原理:
插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。插入排序就类似排纸牌,从牌桌上抓牌排在手里,手里的牌始终是有序的,每次都把牌放在相应的位置,这就是插入排序。插入排序步骤如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5,直到所有元素归位
举例说明:
现在需要对数组序列5 3 4 7 2 8 6 9 1 运用插入排序算法从小到大排序。
第一轮:假设最左边的数字5已经完成排序,所以此时只有5是已归位的数字。
第二轮:接下来,从待排数字(未排序区域)中取出最左边的数字3,将它与左边已归位的数字进行比较。若左边的数字更大,就交换这两个数字。重复该操作,直到左边已归位的数字比取出的数字更小,或者取出的数字已经被移到整个序列的最左边为止。由于5>3,所以交换这两个数字位置。
第三轮:此时3和5已归位,还剩下右边7个数字未排序。同上述操作,由于4<5,4>3,因此将4插入3与5之间,此时3、4、5均已归位。
第三轮:重复上述操作直到所有数字都归位,排序即完成。
插入排序(Insertion Sort)代码实现:
public class Demo {
public static void main(String[] args) {
int[] array= {5,3,4,7,2,8,6,9,1};
int[] newarray=insertionSort(array);
for(int arr:newarray) {
System.out.print(arr+" ");
}
}
public static int[] insertionSort(int[] array){
for(int i=1;i<array.length;i++) {
for(int j=i;j>0;j--) {
if(array[j]<array[j-1]) {
int temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
}
return array;
}
}
插入排序(Insertion Sort)的时间复杂度:
在插入排序中,需要将取出的数据与其左边的数字进行比较。就跟前面讲的步骤一样,如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换数字的位置。然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换数字,直到它到达整个序列的最左边为止。具体来说,就是第k轮需要比较k-1次。因此,在最糟糕的情况下,第2轮需要操作1次,第3轮操作2次....第n轮操作n-1次,所以时间复杂度和冒泡排序的一样,都为O(n²)。和前面讲的排序算法一样,输入数据按从大到小的顺序排列时就是最糟糕的情况。