插入排序:
通常人们整理桥牌的时候都是一张一张来,将每一张牌插入到其他已经有序的牌中。在计算机的实现中,为了给要插入元素腾出空间,我们需要将其余所有元素再插入之前都向右移动一位,这种算法就叫做插入排序。
与选择排序一样,当前索引左边的所有元素都是有序的,但他们的最终位置还不确定,为了给更小的元素腾出空间,他们可能会被移动。但是当索引到达数组的右端时,数组排序就完成了。
和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。例如,对一个很大且其中的元素已经或接近有序的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快的多。
如下图:
代码如下:
import java.util.Arrays;
public void Sort{
public static void main(String []args){
int []arr={ 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };
insertSort(arr);
System.out.print(Arrays.toString(arr));
}
public static void insertSort(int []arr){
for(int i=1;i<arr.length;i++){
int per=i-1;
int value=arr[i];
while(per>=0&&arr[per]>value){
arr[per+1]=arr[per];
per--;
}
arr[per+1]=value;
}
}
}
希尔排序:
为了展示初级排序算法性质的价值,接下来我们将学习一种基于插入排序的快速的排序算法。对于大规模乱序数组插入排序很慢,因为他只会交换相邻的元素,因此元素只能一点一点地从数组的一端到另一端。例如,如果主键最小的元素正好在数组的尽头,要将他挪到正确位置就需要N-1次移动,希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。
希尔排序的核心思想是使数组中任意间隔为H的元素都是有序的。这样的数组又被称为有序数组。换句话说,一个H有序数组就是H个互相独立的有序数组编织在一起组成的一个数组。在进行排序时如果H很大,我们就能将元素移动到很远的地方,为实现更小的H有序创造方便。用这种方式对于任意以1结尾的H序列,我们都能够将数组排序。这就是希尔排序。
如图:
代码为:
import java.util.Arrays;
public void Sort{
public static void main(String []args){
int []arr={ 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };
shellSort(arr);
System.out.print(Arrays.toString(arr));
}
public static void shellSort(int []arr){
for(int grep=arr.length/2;grep>0;grep/=2){
for(int i=grep;i<arr.length;i++){
int per=i-grep;
int value=arr[i];
while(per>=0&&arr[per]>value){
arr[per+grep]=arr[per];
per-=grep;
}
arr[per+grep]=value;
}
}
}
}