程序员必须掌握的8大排序算法(一):直接插入排序

来源:互联网 发布:java整形转换为字符串 编辑:程序博客网 时间:2024/06/06 00:39

分类:
1)插入排序(直接插入排序、希尔排序)
2)交换排序(冒泡排序、快速排序)
3)选择排序(直接选择排序、堆排序)
4)归并排序
5)分配排序(基数排序)
这里写图片描述

一、直接插入排序

(一)基本思想
在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
这里写图片描述
(二)代码实现(Java)

import java.util.Arrays;public class Sort {    public static void insertSort(int[] array) {         int i, j, temp;         for (i = 1; i < array.length; i++) { temp = array[i];               j = i;            // 将大于temp的值整体后移一个单位            while(j > 0 && array[j-1] > temp)            {                array[j] = array[j-1];                j--;            }            array[j]=temp;        }      }      public static void main(String[] args) {        int[] arr = {57, 68, 59, 52};        System.out.println("Original array: " + Arrays.toString(arr));          insertSort(arr);        System.out.println("Sorted array: " + Arrays.toString(arr));       }}

运行结果:
Original array: [57, 68, 59, 52]
Sorted array: [52, 57, 59, 68]

程序分析:
(1) i = 1, temp = a[1] = 68, j = 1, array[0] = 57, array[0] > temp不成立,不需要调整

(2)i = 2,temp = a[2] = 59,
① j = 2,array[1] = 68 > temp,执行循环array[2] = array[1] = 68,j自减。
② j = 1, array[0] = 57 > temp不成立,循环结束。
③ 最后执行array[1] = temp = 59,此时arr = {57,59,68,52}

(3)i = 3,temp = a[3] = 52
① j = 3, array[2] = 68 > temp,执行循环array[3] = array[2] = 68,j自减
② j = 2,array[1] = 59 > temp,执行循环array[2] = array[1] = 59,j自减
③ j = 1,array[0] = 57 > temo,执行循环array[1] = array[0] = 57,j自减后变为0,循环结束
④ 最后执行array[0] = temp = 52,此时array = {52, 57, 59, 68}