插入排序
直接插入排序
基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
算法实现:直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。对于一个无序序列arr{4,6,8,5,9}来说,我们首先先确定首元素4是有序的,然后在无序序列中向右遍历,6大于4则它插入到4的后面,再继续遍历到8,8大于6则插入到6的后面,这样继续直到得到有序序列{4,5,6,8,9}。
//假设前面有序,不管后面 将每一个数 插入到前面合适的位置
public class InsertSort {
public static void main(String[] args) {
int arr[] = {101,34,119,1};
insertSort(arr);
//第一轮 {101,34,119,1} ->{34,101,119,1}
//第一轮 {101,34,119,1} ->{34,101,119,1}
}
public static void insertSort(int arr[]){
for (int i = 1; i < arr.length; i++) {
int insertVal = arr[i]; //要插入的数的值
int insertIndex = i-1; //要插入的前一个数的下标
//给insertVal 找到位置
//insertIndex >= 0 :保证在给insertVal 找插入位置 不越界
while (insertIndex >= 0 && insertVal < arr[insertIndex]){
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明插入的位置找到 insertIndex +1
//当不是有序的时候才换
if (insertIndex+1!=i) {
arr[insertIndex + 1] = insertVal;
}
System.out.println("第"+i+"轮插入");
System.out.println(Arrays.toString(arr));
}
}
}