码迷,mamicode.com
首页 > 编程语言 > 详细

《算法导论》学习Day1

时间:2015-07-02 22:33:57      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

#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; }

 

《算法导论》学习Day1

标签:

原文地址:http://www.cnblogs.com/suzyc/p/4596698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!