【算法】--插入排序

插入排序

插入排序算法是一个对少量元素进行排序的有效算法。
它的伪码是以一个过程的形式给出的,称为 INSERTION-SORT ,它的参数是一个数组 A [ 1 … n ],包含了 n 个待排数字。(在伪码中, A 中元素的个数 n 用 A.length 来表示。)输入的各个数字是 原地排序 的(sorted in place),就是说这些数字是在数组 A 中进行重新排序的,在任何时刻,至多只有其中的常数个数字是存储在数组之外的。
当过程 INSERTION-SORT 执行完毕后,输入数组 A 中就包含了已排好序的输出序列。

//伪码表示
INSERTION-SORT(A)
    for j = 2 to A.length
        key = A[j] 
        // Insert A[j] into the sorted sequence A[1 .. j - 1]
        i = j - 1
        while i > 0 and A[i] > key
            A[i + 1] = A[i]
            i = i - 1
        A[i+1] = key
//java表示
public static void insertionSort(int[] arry){
    for(j=2;j<arry.length;j++){
        key=arry[j];
        i=j-1;
        while(i>0&&arry[i]>key){
            arry[i+1]=arry[i];
            i--;
        arry[i+1]=key;
        }
    }
}

算法分析

INSERTION-SORT 过程的时间开销与输入有关。此外,即使排序两个相同长度的输入序列,所需的时间也可能不同。这取决于它们已排序的程度。一般来说,算法所需的时间是与输入规模同步增长的,因而常常将一个程序的运行时间表示为其输入的函数。这里就涉及到两个名词“运行时间”和“输入规模”。

输入规模 的概念与具体问题有关,最自然的度量标准是输入中的元素个数。

算法的 运行时间 是指在特定输入时,所执行的基本操作数(或步数)。这里我们假设每次执行第 i 行所花的时间都是常量 ci

首先给出 INSERTION-SORT 过程中,每一条指令的执行时间及执行次数。对 j = 2, 3, …, n , n = A.length ,设 tj为第5行 while 循环所做的测试次数。当 for 或 while 循环以通常方式退出时,测试要比循环体多执行1次。另外,假定注释部分不可执行。

该算法总的运行时间是每一条语句执行时间之和。为计算总运行时间 T = [ n ],对每一对 cost 和 times 之积求和。得:

即使是对给定规模的输入,一个算法的运行时间也可能要依赖于给定的是该规模下的哪种输入。例如,在 INSERTION-SORT 中,如果输入数组已经是排好序的,那就会出现最佳情况。对 j = 2, 3, …, n 中的每一个值,都有 tjj = 1,则最佳运行时间为:

这一运行时间可以表示成 a n + b ,常量 a 和 b 依赖于语句的代价 ci ;因此,它是 n 的一个 线性函数 。

如果输入数组是按照逆序排序的,那么就会出现最坏情况。我们必须将每个元素 A [ j ]与整个已排序的子数组 A [ 1 … j - 1 ]中的每一个元素进行比较,因而,对 j = 2, 3, …, n ,有 tj = j 。则最坏运行时间为:

这一最坏情况运行时间可以表示为 a n2 + b n + c ,常量 a , b 和 c 仍依赖于语句的代价 ci ;因而,这是一个关于 n 的 二次函数 。

发布了5 篇原创文章 · 获赞 0 · 访问量 34

猜你喜欢

转载自blog.csdn.net/qq_41160771/article/details/104891272