数据结构之插入排序(Java)
1、基本思想
依次取出数组中的元素,将其插入到已经排好序的元素序列中,得到一个新的、排好序的数组。即每一步将一个数据插入到前面已经排好序的数组中,直到全部插入完为止。
2、算法描述
(1)从第i个元素开始(第一个元素认为已经被排序,因此i=1),将待插入的值赋值为temp=array[i](设置“监视哨”,即待插入的值);
(2)在已经被排序的元素序列中进行搜索,从后向前扫描,设置开始扫描的位置j(j=i-1);若搜索到第j个元素大于“监视哨”的值(即array[j]>=temp)时,将该元素移到下一个位置(即array[j+1]= array[j]);
(3)重复(2),将temp插入到array[j+1]的位置上;
(4)重复(1)。
3、代码实现(Java语言)
import java.util.Scanner;
public class InsertSort {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个整数数组(并用逗号隔开):");
String str=scanner.next();
String[] arr1=str.split(",");
int[] arr=new int[arr1.length];
for (int i=0;i<arr.length;i++){
arr[i]=Integer.parseInt(arr1[i]); //将string型转换成int型
}
System.out.print("初始数组:");
printArray(arr);
System.out.println();
insertSort(arr);
System.out.print("排序之后的最终结果:");
printArray(arr);
System.out.println();
}
//打印数组
public static void printArray(int arr[]){
for (int i:arr){
System.out.print(i+" ");
}
}
//插入排序
public static void insertSort(int[] arr){
int i,j;
for (i=1;i<arr.length;i++){
int temp=arr[i];
for (j=i-1;j>=0 && arr[j]>temp;j--){
arr[j+1]=arr[j];
}
//for循环中j减了一次,所以是j+1
arr[j+1]=temp;
System.out.print("第"+i+"趟排序之后的数组:");
printArray(arr);
System.out.println();
}
}
}

4、算法分析
(1)时间复杂度
如果待排序数组是有序的,只需当前元素跟前一个元素比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(N)。最坏的情况是待排序数组是逆序的,总的比较次数为1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(n^2),平均情况和最坏情况的时间复杂度一样。
(2)稳定性分析
在插入排序中,两个及以上的相同的数据,在排序之后位置是不会发生变化的,所以插入排序是稳定的排序方法。
浙公网安备 33010602011771号