2021/9/21(希尔排序 + 快速排序)
2021/9/21(希尔排序 + 快速排序)
简单插入排序存在的问题:
当存在这样一个数组:
Arr = {2,3,4,5,6,1}
当需要插入的数是较小的数时,这是需要移动次数非常多!
插入排序代码:
/**
* insertVal 是即将要进行插入的值
* index 是有序表中最后一个值的下标
* @param arrays
*/
// 第二种解决方案 , 这个才是真的插入操作 最优解法
public static void insert2(int[] arrays){
int insertVal = 0;
int index = 0;
int length = arrays.length;
for (int i = 1; i <= length-1; i++) {
// 准备插入的数
insertVal = arrays[i];
// 表示与有序表的最后元素的下标
index = i-1;
// 如果插入的数比被插入的数小
while (index>=0 && insertVal<arrays[index]){
arrays[index+1] = arrays[index];
index--;
}
// //把插入的数放入合适位置
arrays[index+1] = insertVal;
}
}
希尔排序介绍
1959年提出的排序算法,是简单插入排序进过改进之后的一个更高效的版本。也称缩小增量排序
当然shell排序也是插入排序
// 总体代码实现
public static void shellSort(int []array){
int temp = 0;
int index = 0;
int length = array.length;
// 步长
int gap = length/2;
while (gap >0){
for (int i = gap; i < length; i++) {
temp = array[i];
index = i - gap;
while (index>=0 && temp<array[index]){
array[index+gap] = array[index];
index-=gap;
}
array[index+gap] =temp;
}
gap /=2;
}
}
快速排序
快排,面试最喜欢问的排序算法。这是运用分治法的一种排序算法。
快速排序,说白了就是给基准数据找其正确索引位置的过程.
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
空间换时间 快