插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个插入元素。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
算法步骤
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
如果比较操作的代价比交换操作大的话,可以采用
二分查找法
来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。
插入排序示例代码
/**
* 插入排序
*
* @author bianjie
*
*/
public class Insert {
/**
* 进行插入排序
* @param data 需要排序的数据
*/
public static void insert(int[] data) {
// 每次排序前数据
printData(data);
//从第二个数据开始,与已经排序好的数列进行比较
for (int index = 1; index < data.length; index++) {
int targetIndex = index;
// 等待插入的数据
int currentData = data[index];
//循环进行数据排序,若当前数据比已经排序的数列中数据小,将数列的数据往后移动,找到满足的位置
while ((targetIndex > 0) && (data[targetIndex - 1] > currentData)) {
//数据后移
data[targetIndex] = data[targetIndex - 1];
targetIndex--;
}
// 插入到合适的位置
data[targetIndex] = currentData;
// 打印每次排序
printData(data);
}
}
/**
* 打印数据
*
* @param data
*/
public static void printData(int data[]) {
for (int i : data) {
System.out.print(i + " ");
}
System.out.println();
}
public static void main(String[] args) {
int data[] = { 8, 2, 4, 9, 3, 6, 7, 10 };
// 进行排序
insert(data);
}
}
运行结果