import java.util.Arrays;
/**
* java编程题:用Java实现一个插入排序算法
*
* 基本思想:
* 在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
*/
public class Test13 {
public static void main(String[] args) {
int[] sortNum = {12,33,28,86,15,62,9,38}; //定义数组
System.out.println("排序前:");
System.out.println(Arrays.toString(sortNum)); //排序前
insertSort(sortNum); //开始排序
System.out.println("排序后:");
System.out.println(Arrays.toString(sortNum)); //排序后
}
/**
* 插入排序方法
* @param sortNum
*/
private static void insertSort(int[] sortNum){
int len = sortNum.length; // 获取数组长度,为了更高效,从for循环外获取数组长度
int j = 0;
int temp = 0;
/*
//写法1
for (int i = 1; i < len; i++) { // 从第二个元素开始,因为默认第一个元素是已经排好序的
temp = sortNum[i]; // 待插入的元素,在第二个for循环中此值不能变的
for (j = i; j > 0 && temp < [j-1]; j--) { // 如果前一个元素大于待插入元素,则将前面的值后移
sortNum[j] = sortNum[j-1]; // 交换位置
}
sortNum[j] = temp;
}
*/
//写法2
for (int i = 1; i < len; i++) { // 从第二个元素开始,因为默认第一个元素是已经排好序的
temp = sortNum[i]; // 待插入的元素,在下面的for循环中此值不能变的
for (j = i; j > 0; j--) {
if(sortNum[j-1] > temp){ // 如果前一个元素大于待插入元素,则将前面的值后移
sortNum[j] = sortNum[j-1]; // 交换位置
}else{
break;
}
}
sortNum[j] = temp;
}
/*
//写法3
for (int i = 1; i < len; i++) { // 初始是从第二个元素开始的,因为默认第一个元素是已经排好序的
temp = sortNum[i]; // 抽出待插入的元素,在下面的while循环中此值是不能变的
j = i; // 记录待插入的元素对应的索引。此索引要从后向前逐一对比。如果前一个元素大于待插的,那么将向移动一位
while (j > 0 && (sortNum[j - 1] > temp)) {
sortNum[j] = sortNum[j - 1]; // 向后移动一位
j--; // 同时索引向前减一
}
sortNum[j] = temp; // 一直到第一个元素或者遇到小于待插入的元素时,跳出while循环,此时j便是待插入的元素的位置索引
}
*/
/*
//写法4,容易理解,有点像冒泡排序的写法
for(int i = 1 ; i < len; i++){
for(j = i; j > 0; j--){
if(sortNum[j] < sortNum[j - 1]){
temp = sortNum[j];
sortNum[j] = sortNum[j - 1];
sortNum[j - 1] = temp;
}else{
break;//不需要交换,直接跳出循环
}
}
}
*/
}
}
参考:
http://www.cnblogs.com/0201zcr/p/4764427.html
http://www.cnblogs.com/xiaoming0601/p/5862793.html
http://www.cnblogs.com/xiaoduc-org/p/5745880.html
http://blog.csdn.net/ouyang_peng/article/details/46547091
http://blog.csdn.net/lovoo/article/details/51755695
http://blog.csdn.net/qy1387/article/details/7752973