插入排序
插入排序(InsertionSort)的基本思想是:将待排序文件中的一个记录按照排序码的大小插入到一个有序序列的适当位置,使得插入后的序列仍然有序。用同样的方法可将所有记录全部插入到有序序列中,完成排序运算。插入排序主要包括两种方法:直接插人排序和希尔(Shell)排序。
直接插入排序(Straight Insertion Sort)
一、基本思想
把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。
二、代码实现
下面用两种方式实现,一个是for循环,另一个是while。
private static int[] StraightInsertSort(int[] arr) {
// 思路:对于一个无序数组,从第一个元素开始,将数组分为左部分和右部分,初始是左边只有一个、右边length-1个。
// 即左边一个元素肯定是有序,右边len-1个无序,现在要每次从右部分拿出一个(拿的这个元素是右部分中左边数第一个))插入到左部分的有序序列中
// 右部分的这个元素就是待插入元素,它依次和左部分每个元素进行比较,从右向左的进行比较,这样比较的好处是,如果待插入元素刚好大于左部分的最右边元素
// 那这就不需要比较了,退出循环,待排序元素直接插入成功,如果待插入元素小于左部分的最右边元素,那么需要把他们俩交换位置,
// 循环不结束,然后下标减1,继续和左部分第二个元素,如果还小,继续调换位置,最后一直调换到arr[0]的位置,如果还小,和arr[0]
// 调换,循环结束。
int temp = 0;
for(int i=0;i<arr.length-1;i++)
// 外循环:这样想,一开始左部分一个元素,它肯定是有序的,右部分len-1个元素,把这len-1个元素插入
// 肯定得循环len-1次
for(int j=i+1;j>0;j--) {
// 内循环:当i位置循环开始,说明i位置之前(包括i位置)是