**** ## 插入排序的普通算法** **
static void insertionSort(int []b) {//正常函数算法
int number=b.length;
for(int i=1;i<number;i++) {
int j=i;
while(j>0&&b[j-1]>b[j]) {//就是j-1<j找到位置了 即a[j-1]<a[j]将a[j]位置赋值上a[i]
if(j-1==0) {//考虑0的特殊情况 以免数组越界的一个条件判断
int temp=b[0];
b[0]=b[j];
b[j]=temp;
}else {
int temp=b[j-1];
b[j-1]=b[j];
b[j]=temp;
}
j--;
}
}
for( int i=0;i<N;i++) {
System.out.print(b[i]+" ");
}
}
插入排序的递归算法
static void insertionSort2(int []b,int number) {//递归算法
if(number==1) return;//只有一个数 返回
insertionSort2(b,number-1);//递归到 第二位与第一位比较然后返回
int x=b[number-1];
int index =number-2;
int y=b[index];
while(x<y) {
int temp=y;
b[index]=x;
b[index+1]=temp;
if(index==0)break;
index--;
x=b[index+1];
y=b[index];
}
if(number==b.length) {
for( int i=0;i<N;i++) {
System.out.print(b[i]+" ");
}
}
}
插入排序:
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为 。
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为 。
图 源于:https://www.runoob.com/w3cnote/insertion-sort.html