一、插入排序思想
插入排序分为直接插入排序,二分插入排序,希尔排序。
其中直接插入排序和二分插入排序是稳定的算法,希尔排序是不稳定的算法。
直接插入排序
通过设置哨位,每次将哨位中的数插入哨位前已经排序好的序列,得到新的排序好的序列,然后哨位递增,直到哨位挪动至待排序序列的最后一位为止。
基本思路:
1、设置哨位i = 1
2、将a[i]与a[0]~a[i - 1]的序列从后往前进行比较,如果哨位位置的数比哨位前一位要小,那么两个位置的数交换,标志待排序数的标志位递减。注意,这里需要一个标志位来标志待排序的数挪动到哪个位置,而不是挪动哨位。
3、如果标志位的数比标志位前一位的数要小,则一直交换,直到标志位的数不比标志位前一位的数小或者标志位已经挪动到数组最前端为止(即标志位为0)。
4、递增哨位,重复第二步,直到哨位挪动至数组最末端,排序结束
二、性能分析
直接选择排序的最差时间复杂度为O(n2),最优时间复杂度为O(n),平均时间复杂度为O(n2),
空间复杂度为O(1),优点是实现简单,不占用多余空间,但效率较低,并且经常需要交换数据。
三、代码实现
import java.util.Arrays;
/*
*插入排序
*/
public class InsertionSort{
public static void Isertion(int[] arr){
for(int key=1;key<arr.length;key++) {
int temp;
for(int i=key;i>0;i--) {
if(arr[i]<arr[i-1]) {
temp = arr[i-1];
arr[i-1]=arr[i];
arr[i]=temp;
}else {
break;
}
}
}
}
public static void main(String [] args) {
int arr[] = new int[] {1,6,2,2,5};
InsertionSort.Isertion(arr);
System.out.println(Arrays.toString(arr));
}
}
本文介绍了插入排序的三种类型:直接插入排序、二分插入排序和希尔排序。直接插入排序是一种稳定的排序算法,通过设置哨位逐步将元素插入已排序序列。文章详细描述了直接插入排序的基本思路,并分析了其性能,最坏、最好和平均时间复杂度均为O(n^2),空间复杂度为O(1)。此外,还提到插入排序虽然实现简单,但效率相对较低,常需要交换数据。
233

被折叠的 条评论
为什么被折叠?



