排序算法——插入排序
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。对于少量元素的排序,它是一个有效的算法。
插入排序是从第二个元素开始与第一个元素作比较,第二个元素小于第一个元素就把第二个元素插入到第一个,以此类推。
例如一组数组{9,8,7,6,5,4,3,2,1},先以第二个数8进行比较,比较前面的数也就是8和9比较,发现8比9小,然后把第二个数8插入到第一个数9前面得到数组{8,9,7,6,5,4,3,2,1};再以第三个数7进行比较,比较前面的数也就是7和9比较,发现7比9小,再比较9前面的数也就是8和7比较,发现7比8小,然后把第三个数7插入到第一个数8前面得到数组{7,8,9,6,5,4,3,2,1},以此类推以第四、五、六、七、八、九个数进行比较,比较前面的数比该数小就将该数插入到比该数小的数的后面,比较前面的数都比该数大就将该数插入到第一个数前面。
次数 | 有序 | 待排序 |
---|---|---|
开始 | 9 | 8,7,6,5,4,3,2,1 |
第一次 | 8,9 | 7,6,5,4,3,2,1 |
第二次 | 7,8,9 | 6,5,4,3,2,1 |
第三次 | 6,7,8,9 | 5,4,3,2,1 |
第四次 | 5,6,7,8,9 | 4,3,2,1 |
第五次 | 4,5,6,7,8,9 | 3,2,1 |
第六次 | 3,4,5,6,7,8,9 | 2,1 |
第七次 | 2,3,4,5,6,7,8,9 | 1 |
第八次 | 1,2,3,4,5,6,7,8,9 |
Java代码实现:
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1};
insertSort(arr);
}
public static void insertSort(int[] array)
{
for(int index = 1; index<array.length; index++){//从左往右用作比较的数据的index,从第二个开始,即index为1
int temp = array[index];//用作比较的数据
int leftindex = index-1;//用作比较的数据的index-1,即用作比较数据的前一个数据的index
while(leftindex>=0 && array[leftindex]>temp){//使用循环比较左边的数据和temp,当左边的数据比较完毕或小于temp时,结束循环
array[leftindex+1] = array[leftindex];//左边的数据往后移一位
leftindex--;//左边的数据的index
}
if(array[leftindex+1] != temp){
array[leftindex+1] = temp;//把temp放到空位上
}
System.out.format("第%d趟:\t", index);
for (int l : array) {
System.out.print(l+",");
}
System.out.println();
}
}
执行结果
从执行结果中可以看出第i趟的数组中前i+1个数是有序数列。