(1) 插入排序 INSERTION-SORT
如果输入数组中仅有常数个元素需要在排序过程中存储在数组之外,则称排序算法是原址的。
插入排序基本思路:该排序算法属于原址排序,在排序过程,只是开辟常数个新的内存空间,即只有常数个元素在排序过程中在数组之外。
算法伪代码:
算法复杂度:时间复杂度为O(N^2) 空间复杂度为O(1)
* 算法伪代码:
* forj=2 to A.length
* key= A[j]
* i=j-1
* while i>0 and A[i]>key
* A[i+1]=A[i]
* i=i-1
* A[i+1]=key //循环完了之后,满足条件之后,才会进行插入*/
举个栗子说明一下:
65 27 59 64 58 (文中仅细化了第四次插入过程)
第1次插入: 27 65 59 64 58 从第二个元素开始遍历,后面的元素不动
第2次插入: 27 59 65 64 58 对第三个元素进行遍历
第3次插入: 27 59 64 65 58
第4次插入: 27 58 59 64 65
package sort;
import java.util.Arrays;
/*插入排序
* 基本思想:每次进行迭代,将待排序元素与已经排好的元素进行比较,知道到达合适的位置,只有常数个元素在排序过程中存储在数组之外,属于原址排序
* 算法复杂度:时间复杂度为O(N^2) 空间复杂度为O(1)
* 算法伪代码:
* for j=2 to A.length
* key= A[j]
* i=j-1
* while i>0 and A[i]>key
* A[i+1]=A[i]
* i=i-1
* A[i+1]=key //循环完了之后,满足条件之后,才会进行插入*/
public class InsertiionSort {
public static void main(String[] args){
int[] arr = {4,8,3,78,56,45,89,67,90};
insertSort(arr);
}
public static void insertSort(int[] arr){
for(int j=1;j<arr.length;j++){
int key = arr[j];
int i = j-1;
while(i>=0&&arr[i]>key){
arr[i+1]=arr[i];
i = i-1;
}
arr[i+1]=key;
}
System.out.println(Arrays.toString(arr));
}
}