插入排序
认为数组当中第一个数值是已经排好序的数值,定义游标从第二个数值开始遍历,游标指向的数据插入到已经排好序的数字当中。
如何插入??
定义j游标指向i的前一个数值 j+1指向 i
j 和 j+1 指向的数据进行比较,如果j+1指向的数值小,则进行交换 , j--
直到 j 无法继续向前指或者 j + 1指向的值大,结束。
时间复杂度:O(n^2)
插入排序Java实现
package com.qc.排序;
import java.util.Arrays;
public class insertSort {
public static void main(String[] args) {
int[] shuzu = {7,5,10,0,3,1,6};
sort(shuzu);
System.out.println(Arrays.toString(shuzu));
}
public static void sort(int[] shuzu) {
for(int i = 1;i<shuzu.length;i++) {//i定位当前元素
for(int j=i-1;j>=0;j--) {//j j+1往回遍历比较元素大小
if(shuzu[j+1]<shuzu[j]) {
int temp = shuzu[j+1];
shuzu[j+1] = shuzu[j];
shuzu[j] = temp;
}else {
break;
}
}
}
}
}
希尔排序(缩小增量排序)
1. 按照数组长度的一半分组,组内进行插入排序 j j+间隔
2.按照数组长度的一半的一半分组,组内进行插入排序
.
.
.
直到无法继续分组,整个数组作为一组,进行插入排序
时间复杂度:nlogn
希尔排序Java实现
package com.qc.排序;
import java.util.Arrays;
public class insertSort {
public static void main(String[] args) {
int[] shuzu = {7,5,10,0,3,1,6};
sort(shuzu);
System.out.println(Arrays.toString(shuzu));
}
public static void sort(int[] shuzu) {
for(int grp = shuzu.length/2;grp>0;grp=grp/2) {//设定步长,初始为数组一半
for(int i = grp;i<shuzu.length;i++) {//i定位当前元素(以后不断向后遍历),下标和步长一样
for(int j = i - grp;j>=0;j=j-grp) {//j j+grp往回遍历 比较元素大小
if(shuzu[j]>shuzu[j+grp]) {
int temp = shuzu[j+grp];
shuzu[j+grp] = shuzu[j];
shuzu[j] = temp;
}else {
break;
}
}
}
}
}
}