小橙書閱讀指南(三)——插入排序

算法描述:一般人們在整理撲克的方法是一張一張的來,將每一張牌插入到其餘已經有序的牌中的適當位置。在算法的實現中,爲了給要插入的元素騰出1個空間,咱們須要將其他全部元素在插入以前都向右移動1位。這種算法叫插入算法。java

算法圖示:git

 算法解釋:在基礎版本中一般的作法是,當新元素須要被插入有序數組的時候,從右向左依次交換。直到新元素到達它合適的位置。算法

Java代碼示例:數組

import common.ArraysGenerator;
import common.Sortable;

import java.io.IOException;
import java.util.Arrays;

public class Insertion implements Sortable<Integer> {

    @Override
    public void sort(Integer[] array) {
        for (int i = 1; i < array.length; ++i) {
            for (int j = i; j > 0; --j) {
                // 若是數組 array[index] < array[index-1] 交換位置
                if (array[j] < array[j - 1]) {
                    int tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;
                }
            }
        }
    }

    public static void main(String arg[]) throws IOException {
        // 從文件中讀取數組的靜態方法,指定文件名和數組長度
        Integer[] arr = ArraysGenerator.fromFile("disorder.txt", 1000000);

        Insertion insertion = new Insertion();
        long start = System.currentTimeMillis();
        insertion.sort(arr);
        long end = System.currentTimeMillis();

        System.out.println(Arrays.toString(arr));
        System.out.println(end - start);
    }
}

Qt/C++代碼示例:ide

void Insertion::sort(int * arr, int len)
{
    for (int i = 1; i < len; ++i) {
        for (int j = i; j > 0; --j) {
            if (arr[j] < arr[j - 1]) {
                int tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;
            }
        }
    }
}

 

算法改進:仍然考慮人們整理撲克的情形,當須要插入的時候並僅僅作了一次操做而且當新牌不須要整理的時候直接摸下一張手牌。所以,要大幅提升插入排序的速度並不難, 只須要在內循環中將較大的元素都向右移動和不是交換兩個元素的位置。spa

算法圖示:code

Java代碼示例:blog

import common.Sortable;

public class InsertionImprove implements Sortable<Integer> {
    @Override
    public void sort(Integer[] array) {
        for (int i = 1; i < array.length; ++i) {
            // 若是array[index] 大於 有序數組array[0-index)的最後1位
            if (array[i] > array[i - 1]) {
                continue;
            }
            for (int j = i; j > 0; --j) {
                // 若是存在 array[j-1] <= array[index] < array[j]
                if (array[i] < array[j] && array[i] >= array[j - 1]) {
                    int tmp = array[i];
                    // 數組array[j-i)的部分 都向後移動1位
                    for (int n = i; n > j; --n) {
                        array[n] = array[n - 1];
                    }
                    array[j] = tmp;
                    break;
                }
            }
        }
    }
}

Qt/C++代碼示例(略)排序

總的來講,插入排序對於部分有序數組十分搞笑,也很適合小規模數組。這很重要,由於這些類型的數組在實際應用常常出現,而且他們也是高級排序算法的中間過程。get

相關連接:

Algorithms for Java

Algorithms for Qt

相關文章
相關標籤/搜索