插入排序:
1.直接插入排序
2.二分法插入排序
3.希尔排序
1>直接插入排序
基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排好序的序列的合适位置(从后向前找),直到全部插入排序完为止。
public class InsertSort {
public static void main(String args[]) {
int[] a = {20,1,32,6,9,0,12,3,16};
System.out.print("排序前: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println(); //换行
//直接插入排序
for(int i=1; i<a.length; i++) {
int temp = a[i];
int j;
for(j=i-1; j>=0; j--) {
if(a[j] > temp) {
a[j+1] = a[j];
} else {
break;
}
}
a[j+1] = temp;
}
System.out.print("排序后: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
结果为:
排序前: 20 1 32 6 9 0 12 3 16
排序后: 0 1 3 6 9 12 16 20 32
2>二分法插入排序
基本思想:二分法插入排序的思想和直接插入一样。但寻找合适位置插入的方式不同,二分法可减少比较次数。
public class BinaryInsertSort {
public static void main(String args[]) {
int[] a = {12,3,1,34,5,9,32,10};
System.out.print("排序前: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println(); //换行
//二分法插入排序
sort(a);
System.out.print("排序后: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
}
private static void sort(int[] a) {
for(int i=0; i<a.length; i++) {
int temp = a[i];
int left = 0;
int right = i-1;
int mid = 0;
while(left <= right) {
mid = (left + right)/2;
if(temp < a[mid]) {
right = mid-1;
} else {
left = mid+1;
}
}
for(int j=i-1; j>=left; j--) {
a[j+1] = a[j];
}
if(left != i) {
a[left] = temp;
}
}
}
}
结果为:
排序前: 12 3 1 34 5 9 32 10
排序后: 1 3 5 9 10 12 32 34
3>希尔排序
基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中。
实质:分组插入的方法
public class ShellSort {
public static void main(String args[]) {
int[] a = {2,12,3,45,30,99,1,29};
System.out.print("排序前: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println(); //换行
//希尔排序
int d = a.length;
while(true) {
d = d/2;
for(int x=0; x<d; x++) {
for(int i=x+d; i<a.length; i=i+d) {
int temp = a[i];
int j;
for(j=i-d; j>=0 && a[j]>temp; j=j-d) {
a[j+d] = a[j];
}
a[j+d] = temp;
}
}
if(d == 1) {
break;
}
}
System.out.print("排序后: ");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
结果为:
排序前: 2 12 3 45 30 99 1 29
排序后: 1 2 3 12 29 30 45 99