直接插入排序
中心思想:
每次拿出一个数和已经排序好的一组数比较,假设a={10,23,56,12,16,25} , 比如在i=3时:a[0]~a[2]已经排好序为[10,16,25],这时要插入a[3]这个数,先和a[2]比较也就是25比较,如果大于25则直接插入在index=3这个位置,如果小于,则让25向后移一位也就是在index=3的位置 , 准备把index=2的位置给a[3]这个数 , 因为最少也会在index=2这个位置 , 然后拿a[3]与a[1]比较 , 小于 , 则a[1]这个数也向后移一位 , 在index=2的位置,让位给大佬 , 大佬和a[0]比较 , 大于 , 则跳出比较 , 站好a[2]让出的index=2的位置
private static void insertSort(int[] a) {
int temp;
int j;
for (int i = 1; i < a.length; ++i) {
temp = a[i];
for (j = i - 1; j >= 0; --j) {
if (temp >= a[j]) {
break;
}
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
}
希尔排序
中心思想:
确定要比较几次 , 也就是要分别比较多少间隔 , 根据数学就是先是取间隔为length/2,之后就是length/2/2直到间隔没有 , 也就是index差值为1 , 对10个数的数组来说就是先是index差值是5的两个数相互比较 , 然后是差值是3的 , 然后是差值是1的(就是相邻的数) , 当进行一轮比较的时候 , 先拿后半段的第一个数和前半段第一个数比较也就是间隔所在数 , 不符合大小相对位置的就交换 , 然后拿后半段第二个数和前半段第二个数比较….这里实现的很巧妙 , 用一个for循环来控制j的取值 , 当后数大于前数时 , 跳出循环 , 这时j=i-gap,然后执行 a[j+gap]=temp;相当于a[i]=temp;也就是保持不变 , 如果后数小于前数 , 则将前数赋值给后数位置 , 而后执行j=j-gap , 之后再执行 a[j+gap]=temp;相当于a[j]=temp;将后数值赋值给前数位置
public static void shellSort(int[] a) {
int temp;
int j;
for (int gap =a.length/2 ; gap >0 ; gap=gap/2) {
for (int i = gap; i <a.length ; ++i) {
temp=a[i];
for (j = i-gap; j >=0 ; j=j-gap) {
if (a[j]>temp){
a[i]=a[j];
}else {
break;
}
}
a[j+gap]=temp;
}
}
}
}