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

(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)。

原文地址:http://blog.51cto.com/xvjunjie/2328128

时间: 2024-11-05 14:49:46

图解算法系列之插入排序(优化版)的相关文章

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

(1)算法描述 对于给定的线性空间,依次考察每个元素,当指定的元素比后一个元素大(或者小)的时候就交换位置,然后交换过来的后一个元素继续向前比较,只要比该元素大(或者小)就两两交换,直到不符合交换条件或者到达最前端. (2)算法图解 (3)C/C++代码实现 CustomSort.h void insertionSort(int arr[], int number); CustomSort.cpp void insertionSort(int arr[], int number) { // 一次

图解算法系列之冒泡排序(优化版)

算法描述 在第一层循环中设置一个变量,只要该序列局部有序就不需要进行排序了,提前终止循环. 图解算法 略. C/C++代码实现 Custom.h void BubbleSortAdvanced(int arr[], int number); Custom.cpp void BubbleSortAdvanced(int arr[], int number) { bool exchange; for(int i = 0; i < number; i++) { // 先设置为false exchang

图解算法系列之冒泡排序(Low版)

(1)算法描述 对于给定的线性序列,每一个元素与其下一个元素进行比较,如果满足大于当前元素就交换位置,然后依次向下比较.利用数学归纳法得知:N个元素总共比较N(N-1)次. (2)图解算法 (3) C/C++代码实现 Custom.h void BubbleSort(int arr[], int number); Custom.cpp void BubbleSort(int arr[], int number) { for (int i = 0; i < number; i++) { for(i

图解算法系列之希尔排序

希尔排序 (1)算法描述 对于给定的线性序列,将这个序列按照一定规则进行分组,每个小序列使用插入排序的方法排序.由于是每个分组进行排序,序列总体只是局部有序,全局还是无序的.因此全部的分组进行一次排序后,再将小分组划分成更大的分组进行排序,直到只有一个分组,并且这个分组也是有序的.也就是说上面描述的分组是个增量分组.随着增量的减少,每个分组的元素逐渐变多.当增量减少至1的时候,整个线性序列就有序了. 理解增量分组 (2)图解算法 (3) C/C++代码实现 Custom.h void Shell

排序算法系列:插入排序算法

概述 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. – <大话数据结构> 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Coding-Naga 发表日期: 2016年3月24日 原文链接:http://blog.csdn.net/lemon_tree12138/article/details/50968422 来源:CSDN 更多内容:分类 &

排序算法系列之插入排序 (1)

排序,即是以一定的规则组织数据,排序算法的优劣关键在于比较数据的交换和移动次数. 排序算法需要考虑的几点:数据交换次数,移动次数,数据越界,算法的实用性(符合多种类型) //预知:使用C#拓展方法进行数据输出,使用StringBuilder节约内存开销 public static class DebugExtension { public static void DebugArray<T>(T[] array) { StringBuilder sb = new StringBuilder(ar

排序算法系列——直接插入排序

直接插入排序与希尔排序一起属于插入排序的一种.插入适合于针对小数据量进行排序,当数据量很大时插入排序的效率相对其他排序会较低,因为他的时间复杂度是0(n2)(下面会进行分析). 基本思想:一组待排序的数据,首先将其划分成两部分,一部分是已排好序的,另一部分是待排序的,然后依次从待排序部分取出一个数插入到已排序部分的适当位置,保证第一部分始终是已排好序的,等待排序部分全部取出放入已排序部分之后整个排序过程就完成了. 实现要点:首先取一个关键点,将关键点前面部分作为已排好序部分,关键点后面部分作为待

算法系列-------直接插入排序(InsertionSort)

一. 算法描述 插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序.例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序:第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中:第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序. 以下面5个无序的数据为例: 65 27 59 64

图解算法系列之选择排序

选择排序 (1)算法描述 对于给定的一个线性空间,维护两个区域--"已排序区域"和"未排序区域".遍历每一个元素,找出该元素后边所有元素中,比当前元素绝对值相差最大的元素,与该元素交换位置. (2)算法图解 void selectionSort(int arr[], int number); CustomSort.cpp #include "CustomSort.h" void selectionSort(int arr[], int numbe