《算法导论》学习Day1

#1冒泡排序(Insertion Sort)

插入排序的思路就像排序扑克牌一样,玩家每次抽到一张牌,依次用手中已有的牌与新抽到的牌进行比较,再按一定将新牌按顺序插入已排序的牌中。

C语言实现:

//Insertion_sort Algorithm
/*
eg.
a[]={5,2,4,6,1,3}
    a[0] a[1] a[2] a[3] a[4] a[5]
①   5    2    4    6    1    3
②   2    5    4    6    1    3
③   2    4    5    6    1    3
④   2    4    5    6    1    3
⑤   1    2    4    5    6    3
⑥   1    2    3    4    5    6
从a[1]起设为插入项key,与其之前的每一项进行比较,按大小顺序插入
key向后顺延一位到a[2],以此类推,直到最后一项比较插入完成
*/

#include<stdio.h>
void insertion_sort_up(int *a,int m);
int main()
{
    int a[40];
    int k=0;
    do{
        scanf("%d",a+k);
        k++;
    }while(getchar()!=‘\n‘);
    int i;
    insertion_sort_up(a,k);
    for(i=0;i<k;i++)
        printf("%d ",a[i]);
    return 0;
} 

void insertion_sort_up(int *a,int m)
{
    int i,j;
    int key;
    for(j=1;j<m;j++)
    {
        i=j-1;
        key=a[j];
        while(i>=0&&a[i]>key)
        {
            a[i+1]=a[i];
            i=i-1;
        }
        a[i+1]=key;
    }
}

#2选择排序(Selection Sort)

从所给的n个数中找出最小数与数组中第一个数交换,然后在除去第一个数的余下n-1个数中第2小的数与数组中第二个数交换,以此类推完成前n-1个数交换。(此为升序排列)

伪代码:

Selection_sort(A)1 for  j = 1 to A.length
2         for  i = j to A.length
3             if  A[ i ] < A[ j ]
4                 k = A[ i ]
5                 n = i
6         t = A[ j ]
7         a[ j ] = k
8         a[ i ] = t

C语言实现:

#include<stdio.h>
void selection_sort(int *a,int n);
int main()
{
    int a[40];
    int i=0,j;
    do{
        scanf("%d",a+i);
        i=i+1;
    }while(getchar()!=‘\n‘);
    printf("original:");
    for(j=0;j<i;j++)
        printf("  %d",a[j]);
    printf("\n");
    selection_sort(a,i+1);
    printf("final   :");
    for(j=0;j<i;j++)
        printf("  %d",a[j]);
    return 0;
} 

void selection_sort(int *a,int n)
{
    int i,j,k,t,m,p;
    for(j=0;j<n-1;j++)
    {
        k=a[j];
        for(i=j;i<n;i++)
        {
            if(a[i]<=k) //先前此处少了‘=‘,数次不过= - =
            {
                k=a[i];
                m=i;
            }
        }
        t=a[j];
        a[j]=k;
        a[m]=t;
        printf("time %d    :",j+1);
        for(p=0;p<n-1;p++)
        {
            printf("  %d",a[p]);
         }
         printf("\n");
     }
}

... ...

#n快速排序

#include<stdio.h>
int main()
{
    printf("从小到大排列:\n");
    int i,j,x,m,p,q;
    int a[]={4,3,5,1,2};
    i=0;
    j=4;
    x=a[i];
    printf("原顺序:");
    for(q=0;q<5;q++)
        printf("%d ",a[q]);
    printf("\n");

    while(i<j)
    {
        if(a[j]<x)
        {
            m=a[j];  //标记a[j],因为之后向右挪位会覆盖最后一位
            for(p=j;p>0;p--)
                a[p]=a[p-1];  //除第一位其余全部向右挪一位
            a[0]=m;  //将最后一位换到第一位,即整个数列进行了一次循环右移
            x=a[++i];  //对比项不变,但位置向右移了一位,所以++i
        }
        else
        {
            j--;  //若所在比较项≥对比项,则比较项变动,向左移一位
        }
            if(i==j&&j!=0)
            {
                i=0;
                j--;
                x=a[0];
            }      //如果左右边界i,j相等,则改变对比项,进行下一轮对比;    //如果相等且j=0,说明比较完毕,排序完成.   }
    printf("现顺序:");
    for(q=0;q<5;q++)
        printf("%d ",a[q]);
    printf("\n");

    return 0;
}
时间: 2024-10-31 12:24:49

《算法导论》学习Day1的相关文章

算法导论学习---红黑树具体解释之插入(C语言实现)

前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每一个结点附加颜色位和路径上的一些约束条件能够保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).以下会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i

算法导论学习---红黑树详解之插入(C语言实现)

前面我们学习二叉搜索树的时候发现在一些情况下其高度不是很均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每个结点附加颜色位和路径上的一些约束条件可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).下面会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通的二

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

【算法导论学习-014】计数排序(CountingSortTest)

参考:<算法导论>P194页 8.2节 Counting sort 1.Counting sort的条件 待排序数全部分布在0~k之间,且k是已知数:或者分布在min~max之间,等价于分布在0~max-min之间,max和min是已知数. 2.java 实现 /** * 创建时间:2014年8月17日 下午3:22:14 项目名称:Test * * @author Cao Yanfeng * @since JDK 1.6.0_21 类说明: 计数排序法,复杂度O(n), 条件:所有数分布在0

【算法导论学习-015】基数排序(Radix sort)

1.<算法导论>P197页 8.3节Radix sort 2.java实现 这里仅仅对[算法导论学习-014]计数排序 的参数进行了修改,同时仅仅修改了一行代码. /** * 创建时间:2014年8月17日 下午4:05:48 * 项目名称:Test * @author Cao Yanfeng * @since JDK 1.6.0_21 * 类说明: 利用计数排序实现基数排序 * 条件:待排序的所有数位数相同,注意,即便不相同,也可以认为是最多那个位数,如下面的例子可以认为都是3位数 */ p

【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)

问题来源 <算法导论>P223 9.3-8: Let X[1..n] and Y[1..n] be two arrays, each containing nnumbers already in sorted order. Give an O(lgn)-time algorithm to find themedian of all 2n elements in arrays X and Y. 翻译过来即:求两个等长(n个元素)的已排序数组A和B的中位数 方案1:对两个数组进行归并直到统计到第n

【算法导论学习-012】n个数随机等概率的抽样m个

算法法导论>P129页课后题5.3-7 suppose we want to create a random sample of the set {1,2,3,-,n}, thatis, an m-element subset S, where0≤m≤n, such that each m-subset is equally likely to be created. One waywould be to set A[i]=i for i=1,2,3,-,n, call RANDOMIZE-IN

【算法导论学习笔记】第3章:函数的增长

????原创博客,转载请注明:http://www.cnblogs.com/wuwenyan/ ? 当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通过一定的方法得到较为精确的运行时间,但是很多时候,或者说绝大多数时候,我们并不值得去花精力求得多余的精度,因为精确运行时间中的倍增常量和低阶项已经被输入规模本身的影响所支配.我们需要关心的是输入规模无限增加,在极限中,运行时间是如何随着输入规模增大而增加的,通常来说,在极限情况下渐进地更优的算法在除很小的输入外的所有情

【算法导论学习-23】两个单链表(single linked)求交点

问题:A.B两个单链表如果有交点,返回第一个交点在A中的位置(链表头结点位置为0). 分析:A.B如果有交点,交点的后继一定也是交点,所以一定是Y型相交,所以算法的思想如下 1)  求得A.B的长度,比如ALength,Blength 2)  判断ALength,Blength谁大,比如Alength>Blength 3)  Alength移动到Alength-Blength的位置,开始判断每个节点是否相等,相等则退出. 以本博客中"[算法导论学习-20]单链表(single linked