插入排序算法
个人理解
- 就像军训时候排队,前面有人按照大小个排队了,自己从头到尾找到自己位置,插进去,后面人们自动往后移一个位置.
- 好像打麻将一样,这个算法假定你拿了一手麻将,从左到右要整牌. 于是你从第一张开始,整第二张牌.如果比第一张牌大就放后面,比第一张小就放前面看到第三张,你看比第一张小,那你就放在第一张的位置上,否则再和第二张比,以此类推
缺点
插入排序的缺点在于因为他的遍历方向比较单一,这样可能导致原本只需要动一个数据的操作然后移动了很多个.例如像 {2,3,4,5,6,7,8,9,1}这个数组
实现之
- 尚硅谷的教程中是往后移动一个然后插进去看看,不行再插一个,个人理解好像可以找到排序的插入点后再后移或许更好理解一些
package sort;
import java.util.Arrays;
public class InsertSort
{
public static void main(String[] args)
{
int[] arr =
{ 7, 5, 3, 1, 9, 8, 2, 4, 6, 0, 6 };
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr)
{
int insertVal;
for (int i = 1; i < arr.length; i++)
{
insertVal = arr[i]; // 要插入的值
// 第一个
// 如果最小,那就插前面
if (insertVal < arr[0])
{
// 往后移动一位
moveArr(arr, 0, i);
// 把值插入进去
arr[0] = insertVal;
}
// 插中间
else
{
for (int j = 1; j < i; j++)
{
// 找到需要插入的对应的位置
if (insertVal >= arr[j - 1] && insertVal < arr[j])
{
// 插这里
moveArr(arr, j, i); //往后移动一位
arr[j] = insertVal; //把值赋予对应的位置
//找到位置了就结束本次遍历了
break;//结束, 以防重复遍历
}
}
}
// 大于最后一个
// else if (insertVal>arr[i-1])
// {
// //啥事不干
// }
}
}
/**
*
* 移动数组往后一位
* @param arr
* @param start
* @param stop
*/
public static void moveArr(int[] arr, int start, int stop)
{
for (int i = stop; i > start; i--)
{
arr[i] = arr[i - 1];
}
}
}