七种排序算法的实现
插入排序
直接插入排序
原理
整个区间被分为:有序区间 无序区间
每次选择无序区间的第一个元素,在有序区间内选择合适的位置进行插入。
1.取一个bound位置。【0,bound) 已排序区间 【bound,size)待排序区间。
2.先取bound位置的元素(初始值为0),往前面已排序区间插入。
3.插入完毕后已排序区间仍然有序。
4.把bound位置的元素在前面找到一个合适的位置,同时需要搬运相关元素。
代码实现
public static void insertSort(int[] array) {
//通过bound划分区域
for (int bound = 1; bound <array.length ; bound++) {
int v=array[bound];
int cur=bound-1;//已排序区间的最后一个元素下标
for (;cur>=0;cur--) {
if(array[cur]>v) {
array[cur+1]=array[cur];
array[cur]=v;
} else {
//此时已经找到合适位置
break;
}
}
array[cur+1]=v;
}
}
性能分析
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定排序
特点:
1.当待排序区间元素比较少的时候,排序效率比较高。
2.当整个数组比较接近有序的时候,排序效率也很高。
希尔排序
原理
进阶版本的插入排序
1.先分组
2.针对每组进行插入排序,逐渐缩小组的个数,最终整个数组就接近有序了。
代码实现
public static void shellSort(int[] array) {
int gap=array.length/2;
while (gap>1) {
inserSortgap(array,gap);
gap=gap/2;
}
inserSortgap(array,1);
}
public static void inserSortgap(int[] array, int gap) {
for (int bound = gap; bound <array.length ; bound++) {
int v=array[bound];
int cur=bound-gap;//已排序区间的最后一个元素下标
for (;cur>=0;cur-=gap) {
//找相同组中相邻的元素 同组元素下标差值为gap
if(array[cur]>v) {
array[cur+gap]=array[cur];
array[cur]=v;
} else {
//此时已经找到合适位置
break;
}
}
array[cur