插入排序:是指有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序的一种新的排序方法。
插入排序包括:直接插入排序,二分插入排序,链表插入排序,希尔排序(缩小增量排序),属于稳定排序的一种。
举一个现实生活中插入排序的例子:我们在玩扑克牌的时候,总是将摸到的牌插入到已经排序好的牌中,算法也是如此。
直接插入排序
直接插入排序代码实现:
public static int[] InsertSort(int[] data){
if(data == null||data.length < 2){
return data;
}
for(int i = 1;i < data.length; i++){
int targ = data[i]; //待排序元素
int j = i;
//挨个同targ之前的排序好的元素比较并移动位置。
while(j > 0 && targ < data[j-1]){
data[j] = data[j-1];
j--;
}
data[j] = targ;
}
return data;
}
二分插入排序
二分插入排序实际上就是先使用二分法查找到待排序元素需要插入的位置,然后在去移动元素,插入元素。
public static int[] BinaryInsertSort(int[] data){
if(data == null || data.length == 1){
return data;
}
for(int i = 1; i < data.length; i++){
int targ = data[i];
int b = 0;
int e = i - 1;
int mid = 0;
while(b <= e && targ < data[e]){
mid = (b + e)/2;
if(targ < data[mid]){
e = mid - 1;
}else{
b = mid + 1;
}
}
for(int j = i - 1;j >= e+1;j--){
data[j+1] = data[j];
}
data[e+1] = targ;
}
return data;
}
希尔排序
希尔排序也称缩小增量排序,把待排序的数列按照一定的增量分割成多个子数列,对每个子数列进行排序,然后在用一个较小的增量对数列分割,再对每个子数列进行排序,直到增量为1时,整个数列被分成一列,排序完成,通过减少比较次数和移动次数达到优化插入排序的目的。
public static int[] ShellSort(int[] data){
if(data == null ||data.length == 1){
return data;
}
int mutex = data.length/2;
int l = data.length;
while(mutex > 0){
for(int i = 0; i < l; i =i + mutex){
int targ = data[i];
int j = i - mutex;
while(j >= 0 && targ < data[j]){
data[j+mutex] = data[j];
j = j - mutex;
}
data[j+mutex] = targ;
}
mutex = mutex / 2;
}
return data;
}