Java排序 ------ 插入排序

选择排序

算法中最基础的当数排序了,今天整理记录一下Java中的插入排序。

这里的排序方式按从小到大讲,由大到小其实就是改变下符号。

插入排序有两种实现方式:
一、简单的插入排序
二、希尔排序

因为希尔排序是对简单的插入排序的优化,所以这里先讲简单的插入排序。

一、简单的插入排序

简单的插入排序,理解起来也相当简单,只要你对List集合稍微熟悉,就应该知道List集合的内部是维护着一个数组,这个数组的大小会随着元素的不断添加而被“扩大”,而数组又是一块连续的内存地址,每一个内存地址对应一个元素。因为地址连续所以当我们向集合中添加元素时,所添加元素后面的元素到要向后移动一个内存空间(这也是为什么List集合不适合频繁增删元素的场景的原因),而简单的插入排序正是采用了这种方式。

简单的插入排序过程:
1、拿到待插入的元素;
2、需要一个指针开始指向待插入元素前一位(这里之所以拿前一位,是因为待插入元素开始的脚标是 1 , 知道了这一点,下面的希尔排序也就好理解了)的元素的位置;
3、待插入的元素和指针指向的元素比较大小,如果小于该元素,则指针指向的元素就向后移动一位,最后指针自增,指向下一个元素。
4、待插入元素是从第二个到最后一个依次获取。

代码实现
    public void insertSort(int[] elements){
        int length = elements.length;
        for (int i = 1; i < length; i++) {
            int target = elements[i];//拿到待插入的元素
            int j = i - 1;//记录比较元素的位置
            //移动元素
            while (j >= 0 && target < elements[j]){
                elements[j + 1] = elements[j];// 向后移动元素
                j--;
            }
            //在比较元素前插入元素
            elements[j + 1] = target;
        }
    }


二、希尔排序

希尔排序,只要你理解了简单的插入排序,相信看希尔排序的JAVA代码易如反掌,希尔排序我看别人讲都是讲什么不断分组,不断排序什么的,刚开始学确实弄得一头雾水,在这里我不打算这样讲(也许我这样讲不符合shell的原意,但是好理解啊!)
通过上面简单的插入排序,我们知道待插入元素是从第二个到最后一个依次获取 ,而在希尔排序中,待插入的元素不遵守这个,①待插入元素的获取是从序列的中间位置 d 开始获取,然后完成一次简单的插入排序后,②用 d / 2的值作为待插入元素的开始位置,再完成一次简单的插入排序;重复② 过程直至d / 2小于 1为止。

代码实现
private void shellSort(int[] elements) {
        int length = elements.length;
        int d = length / 2;
        while (d >= 1){
            shellInsert(elements, d);
            d /= 2;
        }
    }

   private void shellInsert(int[] elements, int d) {
        int length = elements.length;
        for (int i = d; i < length; i++) {
            int target = elements[i];//拿到待插入的元素
            int j = i - d;//记录比较元素的位置
            //移动元素
            while (j >= 0 && target < elements[j]){
                elements[j + d] = elements[j];// 向后移动元素
                j -=d;
            }
            //在比较元素前插入元素
            elements[j + d] = target;
        }
    }

猜你喜欢

转载自blog.csdn.net/look_Future/article/details/80290718