欢迎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