一、概念
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。例如, 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
二、比较过程
三、逻辑分析
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。
①用一个临时变量temp存储第i个元素(i>=1,下标从0开始)。
②比较R[i] 和R[i+1],如果R[i+1]<R[i],则R[i+1] = R[i],即把R[i+1]的集合元素依次往右移动一个单位。
③将temp的值赋给R[i]。
四、代码实现
java:
package com.sort.test;
public class Test1 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
int a[] = { 5, 6, 3, 1, 8, 7, 2, 4 };
String b[] = { "sdf", "dsfdsf", "dfsdfsdf", "we", "ww" };
selectionSortInt_S(a);
selectionSortString(b);
}
/**
*
* @param original
* @return
*/
public static void selectionSortInt_S(int[] original) {
int n = original.length;
int i, j;
for (i = 1; i < n; i++) {
int temp = original[i];
for (j = i; j > 0; j--) {
if (temp < original[j - 1]) {
original[j] = original[j - 1];
}else{
break;
}
}
original[j] = temp;
}
for (i = 0; i < n; i++) {
System.out.print(original[i] + "\t");
}
}
/**
*
* @param original
* 需要排序的数组
* @param length
* 数据长度
* @return
*/
public static void selectionSortString(String[] original) throws Exception {
int h = original.length;
for (int i = 1; i < h; i++) {
String temp = original[i];
int j = i - 1;
while (j >= 0) {
if (temp.compareTo(original[j]) < 0) {
original[j + 1] = original[j];
} else {
break;
}
j--;
}
original[j + 1] = temp;
}
for (int i = 0; i < h; i++) {
System.out.print(original[i] + "\t");
}
}
}
运行结果:
1 2 3 4 5 6 7 8 dfsdfsdf dsfdsf sdf we ww
上面两个算法一个是对整数进行排序的,一个是对字符串进行排序的。以selectionSortInt_S()方法为例,先
初始化几个变量,一个是数组的长度,另外两个是用于控制循环的变量。然后根据直接插入排序算法的概念,在外层循环n-1次,所以这个循环这样来写:
for (i = 1; i < n; i++) {
}
接着,初始化临时变量temp,让它等于原数组第一个数据。然后开始内层循环,在这个循环里比较数据的大小。
for (j = i; j > 0; j--) {
if (temp < original[j - 1]) {
original[j] = original[j - 1];
}else{
break;
}
}
original[j] = temp;
这里使用了if else进行判断,如果达到临时变量temp小于已经排好序的里的某一元素的条件,就把数组移动位置,然后把temp插入到那个位置。