• 数据结构-实验六 排序


    实验六   排序

     

    实验目的

    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("顺序排序,初始数据序列为:
    ");
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
        s_sort(E,N);
    
        printf("
    排序后的数据结构为:
    ");
    
        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("直接排序,初始化数据为:
    ");
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
        si_sort(E,N);
    
        printf("
    排序后的数据结构为:
    ");
    
        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("冒泡排序,初始化数据序列为:
    ");
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
        sb_sort(E,N);
    
        printf("
    排序后的数据结构序列为:
    ");
    
        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("归并排序,初始化数据序列为:
    ");
    
        for(i=000;i<N;i++)
    
            printf("%d ",E[i]);
    
        merge(E,N);
    
        printf("
    排序后的数据序列为:
    ");
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
        getch();
    
    }
    View Code

    (二)提高题

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

                                                      

         
         
     
       

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

    (3)程序源代码

    #include <stdio.h>
    
    #include <stdlib.h>
    
    void ShellSort(int a[], int length)
    
    {
    
        int increment;
    
        int i,j;
    
        int temp;
    
        for(increment=length/2;increment>0;increment/=2)
    
        {
    
            for(i=increment;i<length;i++)
    
            {
    
                temp=a[i];
    
                for(j=i-increment;j>=0&&temp<a[j];j-=increment)
    
                {
    
                    a[j+increment]=a[j];
    
                }
    
                a[j+increment]=temp; //将第一个位置填上,记录后移
    
            }
    
        }
    
    }
    
    int main()
    
    {
    
        int i, j;
    
        int a[]={213,111,222,77,400,300,987,1024,632,555};
    
        printf("初始化的数据序列为:
    ");
    
        for(i=0;i<10;i++)
    
        {
    
            printf("%d ",a[i]);
    
        }
    
        ShellSort(a,10);
    
        printf("
    排序后的序列是:
    ");
    
        for(j=0;j<10;j++)
    
        {
    
            printf("%d ", a[j]);
    
        }
    
        printf("
    ");
    
        return 0;
    
    }
    
    #include<stdio.h>
    
    #include<stdlib.h>
    
    #define MAXNUM 10
    
    #define keytype int
    
    typedef struct
    
    {
    
        keytype key;
    
    }datatype;
    
    datatype R[MAXNUM];
    
    //datatype R[MAXNUM]={213,111,222,77,400,300,987,1024,632,555};
    
    void read()
    
    {
    
        int i,n;
    
        printf("请输入要输入的个数:
    ");
    
        scanf("%d",&n);
    
        printf("请输入初始排序数据:
    ");
    
        for(i=1;i<=n;i++)
    
        {
    
            scanf("%d",&R[i]);
    
        }
    
    }
    
    int Partition(datatype R[],int low,int high)
    
    {
    
        R[0]=R[low];
    
        while(low<high)
    
        {
    
            while(low<high&&R[high].key>=R[0].key)
    
                high--;
    
            if(low<high)
    
            {
    
                R[low]=R[high];
    
                low++;
    
            }
    
            while(low<high&&R[low].key<R[0].key)
    
                low++;
    
            if(low<high)
    
            {
    
                R[high]=R[low];
    
                high--;
    
            }
    
        }
    
        R[low]=R[0];
    
        return low;
    
    }
    
    void Quick_Sort(datatype R[],int s,int t)
    
    {
    
        int i;
    
        if(s<t)
    
        {
    
            i=Partition(R,s,t);
    
            Quick_Sort(R,s,i-1);
    
            Quick_Sort(R,i+1,t);
    
        }
    
    }
    
    int main()
    
    {
    
     
    
        int i,s=1,t=10;
    
        read();
    
        /*printf("初始化数据为:
    ");*/
    
       Quick_Sort(R,s,t);
    
       printf("
    快速排序数据为:
    ");
    
       for(i=1;i<=MAXNUM;i++)
    
        printf("%d ",R[i]);
    
    }
    View Code
  • 相关阅读:
    ApiDoc 一键生成注释
    质量报告之我见
    一些 ssh 小技巧
    virtualenv简介以及一个比较折腾的scrapy安装方法
    用scrapy数据抓取实践
    linux rootfs制作
    ubuntu环境下android开发环境安装
    弱符号 与 强符号, 强引用 与 弱引用
    链接器和加载器
    wine的使用
  • 原文地址:https://www.cnblogs.com/hakim-laohu/p/6639046.html
Copyright © 2020-2023  润新知