插入排序将某一个元素(假设为tar,tar=arr[k])插入到它之前的第一个大于它的元素前,如果没有找到比它大的元素,则不进行插入操作;因为这里的操作是插入而不是交换,所以要将tar之前到第一个大于tar的元素均向后移动一格,因此其中使用while循环进行移动操作。
不论递归或者迭代实现的插入排序,它们的流程是相同,都是数组的前两个元素开始操作,过程大致如下:
假设所给排序元素为{5,3,6,9,7,8,1}
每次均找第一个比它大的进行插入操作, 没有找到则不进行操作
第1次 i=1: 3 5
第2次 i=2: 3 5 6
第3次 i=3: 3 5 6 9
第4次 i=4: 3 5 6 7 9
第5次 i=5: 3 5 6 7 8 9
第6次 i=6: 1 3 5 6 7 8 9
插入排序递归实现
/**
* 递归实现插入排序
* 给定一个一维数组,有一个指针指向数组的最后一个元素,每次指针向前移动一次并于下标0~(n-1)进行比较插入迭代,
* 当发现arr[n]大于前面的元素值时停止,然后使大于arr[n]之后的那一个元素与arr[n]进行交换,
* 当不断变化的指针等于0(即到第一个元素)时使递归退出
* @param arr
* @param k 最大索引值
*/
static void insertSort(int[] arr,int k) {
if(k == 0)return;
//对前k-1个元素进行排序
insertSort(arr,k-1);
//把位置k的元素插入到前面的部分
int x = arr[k];
int idx = k-1;//好移动k之前的数,
while(idx >=0 && x<arr[idx]) {
arr[idx+1] = arr[idx];
idx--;
}
arr[idx+1] = x;//将k的值插入到到在它前面的第一个大于等于arr[k]的前面
}
插入排序迭代实现
static void insertSort(int[] arr) {
for(int i=1;i<arr.length;i++) {
int tar = arr[i];
int idx = i-1;
while(idx>=0 && tar<arr[idx]) {
arr[idx+1]=arr[idx];
idx--;
}
arr[idx+1] = tar;
}
}