实验六   排序

 

实验目的

1、排序的基本概念

      1.掌握在数组上进行各种排序的方法和算法。

      2.深刻理解各种方法的特点,并能灵活应用。

      3.加深对排序的理解,逐步培养解决实际问题的编程能力。

实验内容

1、排序的基本概念

(一)基础题

     1.编写各种排序方法的基本操作函数:

    (1)s_sort(int e[],int n)选择排序;

    (2)si_sort(int e[],int n)直接插入排序;

(3)sb_sort(int e[],int n)冒泡排序;

(4)merge(int e[],int n)二路合并排序。

     2.调用上述函数实现下列操作:

(1)对于给定的数组E[N]={213,111,222,77,400,300,987,1024,632,555}调用选择排序函数进行排序;

(2)调用直接插入函数进行排序;

(3)调用冒泡排序函数进行排序;

(4)调用二路合并排序函数进行排序。

(二)提高题

1.编写希尔排序函数对给定的数组进行排序。

2.编写快速排序函数对给定的数组进行排序。

实验结果

1、排序的基本概念

(一)基础题

(1)画出数据结构基本运算的流程图

 

 
   

 

 

 

 

 

 

 

 

(2)程序运行主要结果截图

 

 

 

 

(3)程序源代码

#include<stdio.h>

#include<conio.h>

#define N 10

int E[N]={213,111,222,77,400,300,987,1024,632,555};

void s_sort(int e[],int n)

{

    int i,j,k,t;

    for(i=0;i<n-1;i++)

    {

        for(k=i,j=i+1;j<n;j++)

            if(e[k]>e[j])

            k=j;

        if(k!=i)

        {

            t=e[i];

            e[i]=e[k];

            e[k]=t;

        }

    }

}

int main()

{

    int i;

    printf("顺序排序,初始数据序列为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    s_sort(E,N);

    printf("\n排序后的数据结构为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    getch();

 

}

#include<stdio.h>

#include<conio.h>

#define N 10

int E[N]={213,111,222,77,400,300,987,1024,632,555};

void si_sort(int e[],int n)

{

    int i,j,t;

    for(i=1;i<n;i++)

    {

        for(t=e[i],j=i-1;j>=0&&t<e[j];j--)

            e[j+1]=e[j];

        e[j+1]=t;

    }

}

int  main()

{

    int i;

    printf("直接排序,初始化数据为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    si_sort(E,N);

    printf("\n排序后的数据结构为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    getch();

}

#include<stdio.h>

#include<conio.h>

#define N 10

int E[N]={213,111,222,77,400,300,987,1024,632,555};

void sb_sort(int e[],int n)

{

    int j,p,h,t;

    for(h=n-1;h>0;h--)

    {

        for(p=j=0;j<h;j++)

            if(e[j]>e[j+1])

        {

            t=e[j];

            e[j]=e[j+1];

            e[j+1]=t;

            //p=count2;

        }

    }

}

int  main()

{

    int i;

    printf("冒泡排序,初始化数据序列为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    sb_sort(E,N);

    printf("\n排序后的数据结构序列为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    getch();

}

#include<stdio.h>

#include<conio.h>

#include<malloc.h>

#define N 10

int E[N]={213,111,222,77,400,300,987,1024,632,555};

void merge_step(int e[],int a[],int s,int m,int n)

{

    int i,j,k;

    k=i=s;

    j=m+1;

    while(i<=m&&j<=n)

        if(e[i]<=e[j])

        a[k++]=e[i++];

    else

        a[k++]=e[j++];

    while(i<=m)

        a[k++]=e[i++];

    while(j<=n)

        a[k++]=e[j++];

}

void merge_pass(int e[],int a[],int n,int len)

{

    int f_s,s_end;

    f_s=0;

    while(f_s+len<n)

    {

        s_end=f_s+f_s+2*len-1;

        if(s_end>=n)

            s_end=n-1;

        merge_step(e,a,f_s,f_s+len-1,s_end);

        f_s=s_end+1;

    }

    if(f_s<n)

        for( ;f_s<n;f_s++)

    a[f_s]=e[f_s];

}

void merge(int e[],int n)

{

    int *p,len=1,f=0;

    p=(int *)malloc(n*sizeof(int));

    while(len<n)

    {

        if(f==0)

            merge_pass(e,p,n,len);

        else

            merge_pass(p,e,n,len);

        len*=2;

        f=1-f;

    }

    if(f==1)

        for(f=0;f<n;f++)

        e[f]=p[f];

    free(p);

}

int main()

{

    int i;

    printf("归并排序,初始化数据序列为:\n");

    for(i=000;i<N;i++)

        printf("%d ",E[i]);

    merge(E,N);

    printf("\n排序后的数据序列为:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

    getch();

}
View Code

相关文章: