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

(1)算法描述

对于给定的一个线性空间,遍历考察每一个元素,将当前元素拷贝一份,并将前一个元素拷贝到当前元素的原位置。拷贝出来的元素与前一个元素进行比较,如果满足前一个元素大于或小于当前元素就将当前拷贝出来的元素放到当前位置,否则继续向前比较。

(2)图解算法

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

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

Custom.h

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

Custom.cpp

void insertionAdvancedSort(int arr[], int number) {
// 一次比较每一个元素
for (int i = 0; i < number; i++) {
// 假设当前的元素就是最大值
int current = arr[i];
int j;
// j > 0表示确保比较的元素没有到头
// arr[j-1] > max表示当前元素max比指定的元素arr[j-1]小
for (j = i; j > 0 && arr[j - 1] > current; j--) {
// 交换元素
arr[j] = arr[j-1];
}
// 当前这个元素与指定的元素交换
arr[j] = current;
}
}

(4)Java代码实现

public class InsertionSortAdvanced {
    public static void sort(int[] arr, int number) {
        for (int i = 0; i < number; i++) {
            int current = arr[i];
            int j;
            for (j = i; j > 0 && arr[j-1] > current; j--) {
                arr[j] = arr[j-1];
            }
            arr[j] = current;
        }
    }
}

(5)时间复杂度分析

在最坏的情况下,时间复杂度仍然是O(n^2)。

猜你喜欢

转载自blog.51cto.com/xvjunjie/2328128
今日推荐