图解算法系列之插入排序(Low版)

(1)算法描述

对于给定的线性空间,依次考察每个元素,当指定的元素比后一个元素大(或者小)的时候就交换位置,然后交换过来的后一个元素继续向前比较,只要比该元素大(或者小)就两两交换,直到不符合交换条件或者到达最前端。

(2)算法图解

图解算法系列之插入排序(Low版)

(3)C/C++代码实现

CustomSort.h

void insertionSort(int arr[], int number);

CustomSort.cpp

void insertionSort(int arr[], int number) {
     // 一次考察每个元素
    for (int i = 1; i < number; i++) {
        // 从考察的当前元素开始,向后查找当前元素该放到哪里
        for (int j = i; j > 0; j--) {
            // 如果当前元素比前一个元素小就交换
            if (arr[j] < arr[j - 1]) {
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            } else {
                //  如果如果没有比这个元素大的就提前终止
                break;
            }
        }
    }
}

(4) Java代码实现

public class InsertionSort {
    public static int[] sort(int[] arr, int number) {
        for (int i = 1; i < number; i++) {
            for (int j = i; j > 0; j--) {
                if (arr[j] < arr[j-1]) {
                    int temp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;
                } else {
                    break;
                }
            }
        }
        return arr;
    }
}

(5)时间复杂度分析

虽然插入排序会在数据满足约定的情况下提前终止排序,但是最坏的情况下还是O(n^2)。由于数据的频繁交换,会使得同等数据情况下插入排序慢与选择排序。

猜你喜欢

转载自blog.51cto.com/xvjunjie/2328116