插入排序
将每个元素与左侧元素相比,小于(升序)就将其与左边元素交换
public class InsertSort<T extends Comparable> {
private T arr[];
public InsertSort(T arr[]) {
this.arr = arr;
}
void sort() {
int N = arr.length;
for (int i = 1; i < N; i++) {
for (int j = i; j >= 1&&arr[j].compareTo(arr[j - 1]) <= 0 ; j--) {
T temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
void show_arr(){
for (T a:arr) {
System.out.print(a+" ");
}
}
}
然后测试一下
public class run_test {
public static void main(String[] args) {
String a[]={"E","A","S","Y","Q","U","E","S","T","I","O","N"};
InsertSort<String> is=new InsertSort<>(a);
is.sort();
is.show_arr();
}
}
希尔排序
了解了插入排序通过对插入排序进行简单的修改就可以得到希尔排序,假设一个间隔为h,在数组中对于每个数取相同间隔的看作一个h数组,每次只将h数组进行插叙排序,然后依次缩小h的值直到最后h=1,这样做的话好处在于当h值比较大的时候元素将会移动很远的地方,相对于插入排序不用再一个元素一个元素的依次移动过去,可以很直观的看到通过这个小小的改变将会大大提高排序的效率。
public class Shellsort<T extends Comparable>{
public T arr[];
public Shellsort(T arr[]){
this.arr=arr;
}
public void sort(){
int N=arr.length;
int h=1;
while(h<N/3){h=h*3+1;} //1 4 13 ......
while (h>=1) {
for (int i = h; i < N; i++) {
for (int j = i; j >= h && arr[j].compareTo(arr[j - h])<0;j = j - h){
T temp = arr[j];
arr[j] = arr[j - h];
arr[j - h] = temp;
}
}
h=h/3;
}
}
void show_arr(){
for (T a:arr) {
System.out.print(a+" ");
}
}
}
while(h<N/3){h=h*3+1;} //1 4 13 …这段使用的是knuth序列,虽然这个序列不是最好最快的,但是相对于其他更快的序列相差也不大,而其他序列又更加的复杂。