《算法导论》习题2.3-4 插入排序的递归版本

伪代码:

RECURSIVE-INSERT-SORT (A, n)
  if n>1
     RECURSIVE-INSERT-SORT (A ,n-1)
     InsertLastNumber (A,n)

InsertLastNumber (A,n)
  temp = A[n]
  i=n-1
  while i>0 && A[i]>temp
    A[i+1] = A[i]
    i -=1
  A[i+1]=temp

Java实现:

public class RecursiveInsertSort {
    public static void sort(double A[] , int n)
    {
        if(n>1)
        {
            sort(A,n-1);
            insert(A,n);
        }
        return ;
    }
    public static void insert(double A[],int n)
    {
        double temp = A[n-1];
        int i = n-2;
        while(i>=0 && A[i]>temp)
        {
            A[i+1] = A[i];
            i--;
        }
        A[i+1]=temp;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        double [] A = {1.3, 5 ,2, 6.9, 2.0,7.8,4.3};
        RecursiveInsertSort.sort(A,A.length);
        for(double a:A)
            System.out.print(a+" ");
    }

}
时间: 2024-11-05 05:55:23

《算法导论》习题2.3-4 插入排序的递归版本的相关文章

算法导论习题 通用汇点

来自习题22.1-6 给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink).通用汇点指的是入度为|V|-1,出度为0的节点. 思路: 考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i 相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1 那么可以令游标从矩阵左上角开始,遇1向下,逢

从头看算法导论 习题2.3-7 深入分析

题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素. 算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i],算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn. 批注:该思想,不是最好的(从简洁.时间复杂度上得到结论),不喜勿喷. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h

算法导论习题4-5:芯片检测

习题4-5 3rd edition (4-6 2nd edition) 解法1: 将芯片两两配对,对于后三种情况(至少其中一个是坏的),可以直接将该对芯片丢弃,这样丢弃的好的一定不会超过坏的. 剩下的都是第一种情况,以及可能剩下的单个未配对的. 如果数量为偶数,即没有未配对的,那么"好好"对数一定超过"坏坏"对数,所以每对里面丢弃一个即可. 如果数量为奇数,则保留那个未配对的,并且每对丢掉一个. 解法2: 优点是只需单向检测即可.其实解法1稍作修改也可只用到单向检测

算法导论笔记(一) 插入排序

插入排序: 插入排序属于原地排序(sorted in place),使用的是增量(incremental)方法. 排序从第二个元素开始遍历.在排好序的子数组A[1 .. j -1]中,将元素A[j]插入,形成排好序的子数组A[1 .. j]:然后,重复此操作,直到整个数组有序. 使用for循环实现的升序插入排序: void insertion_sort_asc(int arr[], int len) { if (len <= 0) throw "The length of input ar

《算法导论》读书笔记之插入排序

插入排序的机理与打牌整理手中的牌的做法差不多. (1)开始摸牌时,我们的左手是空的,接着一次从牌面上摸起一张牌,并将它插入到左手一把牌中的正确位置上. (2)为了找到这张牌的正确位置,要将它与手中已有的牌从右到左进行比较. (3)无论什么时候左手中的牌都是有序的. 插入排序升序代码如下: 1 void InsertSort(int a[], int length) 2 { 3 for(int i=1; i<length; i++) 4 { 5 //[a[0],a[i-1]]闭区间始终是有序的,故

算法导论学习笔记(3)-习题2.3-7-排序+二分

question(题意): Describe a O(n lg(n))-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x. 设计一个O(n lg(n))时间复杂度的算法,给定一个n个数字的集合,和一个数字x, 问,是否能在这个集合中找到两个数字,他

算法导论-递归

递归程序在设计时很常见,有时能很大程度上简化问题解决的复杂性. 下面就算法导论的2.3-4习题进行解答. 具体就是写出插入排序的递归版本. 1 void insert_sort(int a[],int n) 2 { 3 if(n==1) return ; 4 else 5 { 6 insert_sort(a,n-1); 7 int i=n-1,temp=a[n]; 8 while(a[i]>=temp&&i>=1) a[i+1]=a[i],i--; 9 a[i+1]=temp;

算法导论4:快速排序 2016.1.4

今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想.我觉得很有道理. 好吧,不扯了.原谅我看书选择了速读策略,中间有很多感觉目前还很难看懂,以后有时间再细细学习.把略过去的在这里记一下. 一.矩阵乘法算法.复杂度从n^3优化到了n^2.81 (数字比较神奇).因为还没学线性代数,所以以后学了再看. 二.递归复杂度的计算和估计.这部分看起来有些复杂,好像需要比较高的数学水平,有空研究一下. 三.堆排序.这个以前已经写过了.http://www.cnblogs.com/itlqs/p/475

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards