欢迎Java爱好者品读其他算法详解:
简单比较排序:http://blog.csdn.net/ysjian_pingcx/article/details/8652091
冒泡排序: http://blog.csdn.net/ysjian_pingcx/article/details/8653732
选择排序: http://blog.csdn.net/ysjian_pingcx/article/details/8656048
快速排序: http://blog.csdn.net/ysjian_pingcx/article/details/8687444
快速排序优化:http://blog.csdn.net/ysjian_pingcx/article/details/8687444
/**
* 直接插入排序的核心程序
* @param array
*/
public void insertSort(int... array) {
int length = array.length;
// 此循环从1开始,就是将0下标的元素当做一个参照
for (int i = 1; i < length; i++) {
if (array[i] < array[i - 1]) { // 将当前下标的值与参照元素比较,如果小于就进入里面
int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
int sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
// 这个循环很关键,从当前下标之前一个元素开始倒序遍历,比较结果如果比当前大的,就后移
for (int j = i - 1; j >= 0 && array[j] > sentry; j--) {
vacancy = j;
array[j + 1] = array[j]; // 后移比当前元素大的元素
}
array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置
}
}
}
@外部循环的开始条件是int i = 1,里面有个if(array[i] > array[i - 1]),也就是如果当前记录比前面的记录小的时候才出列,出列后用sentry = array[i],记录下这个记录,并用vacancy = i,记录下空缺位置。
for (int i = 1; i < length; i++) {
if (array[i] < array[i - 1]) { // 将当前下标的值与参照元素比较,如果小于就进入里面
int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
int sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
for (int j = i - 1; j >= 0 && array[j] > sentry; j--) {
vacancy = j;
array[j + 1] = array[j]; // 后移比当前元素大的元素
}
array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置
我想,这个过程已经将直接插入排序说的不能再往下说了,至少我已经不能说下去了,下面提供完整的代码:
/**
* 直接插入排序算法
* @author PingCX
*
*/
public class InsertSort {
public static void main(String[] args) {
InsertSort insertSort = new InsertSort();
int[] array = { 3, 5, 4, 2, 6};
System.out.println(Arrays.toString(array));
insertSort.insertSort(array);// 调用快速排序的方法
System.out.println(Arrays.toString(array));// 打印排序后的数组元素
}
/**
* 直接插入排序的核心程序
* @param array
*/
public void insertSort(int... array) {
int length = array.length;
// 此循环从1开始,就是将0下标的元素当做一个参照
for (int i = 1; i < length; i++) {
if (array[i] < array[i - 1]) { // 将当前下标的值与参照元素比较,如果小于就进入里面
int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
int sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
// 这个循环很关键,从当前下标之前一个元素开始倒序遍历,比较结果如果比当前大的,就后移
for (int j = i - 1; j >= 0 && array[j] > sentry; j--) {
vacancy = j;
array[j + 1] = array[j]; // 后移比当前元素大的元素
}
array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置
}
}
}
}
/**
* 任何可以比较的类型的直接插入排序算法
*
* @author PingCX
*
*/
public class InsertSortT {
public static void main(String[] args) {
InsertSortT insertSort = new InsertSortT();
Integer[] array = { 3, 5, 4, 2, 6 };
System.out.println(Arrays.toString(array));
insertSort.insertSort(array);// 调用快速排序的方法
System.out.println(Arrays.toString(array));// 打印排序后的数组元素
}
/**
* 直接插入排序的核心程序
*
* @param array
*/
public <T extends Comparable<T>> void insertSort(T[] array) {
int length = array.length;
// 此循环从1开始,就是将0下标的元素当做一个参照
for (int i = 1; i < length; i++) {
if (array[i].compareTo(array[i - 1]) < 0) { // 将当前下标的值与参照元素比较,如果小于就进入里面
T sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
// 这个循环很关键,从当前下标之前一个元素开始倒序遍历,比较结果如果比当前大的,就后移
for (int j = i - 1; j >= 0 && array[j].compareTo(sentry) > 0; j--) {
vacancy = j;
array[j + 1] = array[j]; // 后移比当前元素大的元素
}
array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置
}
}
}
}
欢迎Java爱好者品读其他算法详解:
简单比较排序:http://blog.csdn.net/ysjian_pingcx/article/details/8652091
冒泡排序: http://blog.csdn.net/ysjian_pingcx/article/details/8653732
选择排序: http://blog.csdn.net/ysjian_pingcx/article/details/8656048
快速排序: http://blog.csdn.net/ysjian_pingcx/article/details/8687444
快速排序优化:http://blog.csdn.net/ysjian_pingcx/article/details/8687444