插入排序算法思路(以从小到大排序为例):
首先找到序列中排在第一位置的数值,放到第一位;然后找到序列中排在第二位置的数值,与前一位(排在第一位置)的数值对比,如果前面的值比自己大,则与前面的数值交换位置;然后找到序列中排在第三位置的数值,与前一位(排在第二位置)的数值对比,如果前面的值比自己大,则与前面的数值交换位置,继续与前一位置(排在第一位置)的数据进行对比,如果前面的值比自己大,则与前面的数值交换位置……以此类推,直至排列完成。可参考下图(该图来源于慕课网“程序猿的内功修炼,学好算法与数据结构”课程)。
示例代码:
public class SelectionSort {
/**
* 插入排序法
*
* @param arr
* @param n
* @return
*/
static int[] insertionSort(int[] arr, int n) {
for (int i = 1; i < n; i++) {
// 寻找元素arr[i]合适的插入位置
// 写法1
// for (int j = i; j > 0; j--) {
// if (arr[j] < arr[j - 1]) {
// int temp = arr[j];
// arr[j] = arr[j - 1];
// arr[j - 1] = temp;
// } else {
// break;
// }
// }
// 写法2
// for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
// int temp = arr[j];
// arr[j] = arr[j - 1];
// arr[j - 1] = temp;
// }
// 写法3
int e = arr[i];
int j; // j保存元素e应该插入的位置
for (j = i; j > 0 && arr[j - 1] > e; j--) {
arr[j] = arr[j - 1];
}
arr[j] = e;
}
return arr;
}
public static void main(String[] args) {
int[] arr = { 5, 4, 7, 9, 8, 10, 3, 2, 1, 6 };
arr = insertionSort(arr, 10);
String result = "";
for (int i = 0; i < 10; i++) {
result += arr[i] + " ";
}
System.out.println(result);
}
}
输出结果:
1 2 3 4 5 6 7 8 9 10