直接插入排序:算法的基本思想是把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次即可完成排序过程。
public class Test {
public static void main(String[] args) {
int[] a = { 2, 54, 12, 5, 98};
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
System.out.println();
Test.insertSort(a);
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
}
public static voidinsertSort(int[] a) {
for (int i = 1; i< a.length; i++) {
int j =i;
int t =0;
while (j> 0 && a[j]< a[j - 1]) {
t= a[j];
a[j]= a[j - 1];
a[j- 1] = t;
j--;
}
}
}
}
折半插入排序:折半插入排序也是一样需要将新元素插入到已排好序的数组中,只是这时不是对元素进行逐个比较,而是在插入之前先找到正确的位置,然后直接插入到那个位置当中。
所谓折半查找,也就是将一个数组分成一半来查找,准确地来说,是将数组分成两个一半来查找,
public class Test {
public static void main(String[] args) {
int[] a = { 2, 54, 12, 5, 98};
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
System.out.println();
Test.bInsertSort(a);
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
}
public static void bInsertSort(int[] a){
for (int i = 1; i< a.length; i++) {
int t =a[i];
int low =0;
int high = i- 1;
while (low<= high) {
intmiddle = (low + high) / 2;
if(t < a[middle])
high= middle - 1;
else
low= middle + 1;
}
for (int j =i; j > low; j--){
a[j]= a[j - 1];
}
a[low] =t;
}
}
}
希尔排序:希尔排序算法的基本思想是先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
public class Test {
public static void main(String[] args) {
int[] a = { 2, 54, 12, 5, 98};
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
System.out.println();
Test.shellSort(a);
for (int i = 0; i< a.length; i++) {
System.out.print(a[i]+ " ");
}
}
publicstatic void shellSort(int[] a) {
int d=a.length;
while(d>1){
d=(d+1)/2;
for(inti=0;i<a.length-d;i++){
if(a[i+d]<a[i]){
intt=a[i+d];
a[i+d]=a[i];
a[i]=t;
}
}
}
}
}