插入排序的算法一句话可以描述:
a[0].....a[n-1] n个元素进行排序,假设a[0]...a[i-1]是一个有序序列,将a[i]插入到这个有序序列的适当位置中。
一、常规
最小的有序序列即为a[0],i从1开始到n-1
第一种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从左往右,如果第一次碰到a[i]<a[j],那么记录这个j的位置并break循环,让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)
for (int i = 1; i < array.length; i++) {
int m = -1;//或m = i那么下面的if(m >= 0)改成if(m < i)
for (int j = 0; j <= i - 1; j++) {
// 找要插入的位置
if (array[i] < array[j]) {
m = j;
break;
}
}
if (m >= 0) {
// 将比array[i]大的向后移
int temp = array[i];
for (int k = i - 1; k >= m; k--) {
array[k + 1] = array[k];
}
array[m] = temp;
}
}
或
第二种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从右往左,如果a[i]<a[j],那么记录这个j的位置并继续循环(因为左边可能还有比a[i]大的元素),让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)
for (int i = 1; i < array.length; i++) {
int m = i;
for (int j = i - 1; j >= 0 && array[i] < array[j]; j--) {
m = j;
}
if (m < i) {
// 将比array[i]大的向后移
int temp = array[i];
for (int k = i - 1; k >= m; k--) {
array[k + 1] = array[k];
}
array[m] = temp;
}
}
或再精简一点,其中for (j = i - 1; j >= 0 && array[i] < array[j]; j--);这句代码也可以用另一种方式表达
for (j = i - 1; j >= 0; j--){if(array[i] > array[j])break;},程序非常灵活的,需要随机应变
for (int i = 1, j; i < array.length; i++) {
for (j = i - 1; j >= 0 && array[i] < array[j]; j--);
if (j < i) {
int temp = array[i];
for (int k = i - 1; k >= j + 1; k--) {
array[k + 1] = array[k];
}
array[j + 1] = temp;
}
}
二、将a[i]元素插入到a[0]...a[i-1]有序序列中,a[i]在与a[j],j∈{0..i-1}进行比较大小时,同时进行移位操作
array[i]插入有序子序列array[0]...array[i-1]时,设j∈{0..i-1},若array[i]<array[j],则将array[j+1]替换为array[j] (表示array[j]后移一位),循环直到array[i]>array[j]或循环结束。将array[j+1]的值替换为temp (temp为事先保存的array[i]的值)。
for (int i = 1; i < array.length; i++) {
int temp = array[i], j;
for (j = i - 1; j >= 0 && temp < array[j]; j--) {
// array[i]与arra[j]一边比较,一边移动(当array[i]<array[j])
array[j + 1] = array[j];
}
array[j + 1] = temp;
}
三、a[i]插入有序序列a[0]...a[i-1]时,设temp = array[i],如果a[j]<temp也可以是array[j+1]<array[j],则交换a[j]与a[j+1] j∈{0..i-1}
for (int i = 1; i < array.length; i++) {
int temp = array[i],j;
for (j = i - 1; j >= 0; j--) {
if (array[j] > temp) {
array[j] = array[j] ^ array[j + 1];
array[j + 1] = array[j] ^ array[j + 1];
array[j] = array[j] ^ array[j + 1];
}
}
}
参考:
http://blog.youkuaiyun.com/morewindows/article/details/17488865