码迷,mamicode.com
首页 > 其他好文 > 详细

《软件技术基础》实验指导 实验七

时间:2017-12-25 21:27:13      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:基础   ret   time   int   sort   ref   printf   turn   整型   

排序

实验七 排序

一、实验目的

  1. 熟悉各种内部排序算法
  2. 能够编写程序显示排序过程中各趟排序的结果
  3. 能够编写一些排序的算法

二、实验内容

  1. 采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。
  2. 编写一个双向起泡的排序算法,即在排序过程中交替改变扫描方向,同时显示各趟排序的结果。

Tips

  1. 7.1 希尔排序 https://en.wikipedia.org/wiki/Shellsort
  2. 7.2 鸡尾酒排序 https://en.wikipedia.org/wiki/Cocktail_shaker_sort

Answer

7.1

//希尔排序的程序代码
#include<stdio.h>
//顺序表结构类型定义
typedef int datatype;
typedef struct{
    int key;
    datatype data;
}rectype;
const int N=10;
const int D1=5;

void create(rectype[],int);
void print(rectype[],int);
void shellsort(rectype[],int[]);

//void main()
int main()
{
    rectype r[N+D1];//D1个元素存放监视哨,N个元素存放记录
    int d[3]={5,3,1};//设置3趟的增量
    create(r,N);//建立存放记录的顺序表
    printf("排序前的数据:");
    print(r,N);//输出排序前的记录表
    shellsort(r,d);//希尔排序
    printf("排序后的数据:");
    print(r,N);//输出排序后的记录表
    return 0;
}

//建立顺序表
void create(rectype r[],int n)
{
    printf("输入10个整型数:");
    for(int i=0;i<n;i++)
        scanf("%d",&r[D1+i].key);
}

//输出顺序表
void print(rectype r[],int n)
{
    for(int i=0;i<n;i++)
        printf("%5d",r[D1+i].key);
    printf("\n");
}

//希尔排序
void shellsort(rectype r[],int d[])
{
    int i,j,k,h;
    rectype temp;
    int maxint=32767;
    for(i=0;i<D1;i++)
    {
        r[i].key=-maxint;//设置 T 个监视哨
    }
    k=0;
    do
    {
        h=d[k];//取一趟的增量
        for(i=h+D1;i<N+D1;i++)
        {
            temp=r[i];
            j=i-h;
            while(temp.key<r[j].key)
            {
                r[j+h]=r[j];
                j=j-h;
            }
            r[j+h]=temp;
        }//组内直接插入法排序
        print(r,N);
        k++;
    }
    while(h!=1);
}

7.2

//双向起泡排序的程序代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//顺序表结构类型定义
typedef int datatype;
typedef struct{
    int key;
    datatype data;
}sequenlist;

void create(sequenlist[],int);
void print(sequenlist[],int);
void dbubblesort(sequenlist[],int);

//void main()
int main()
{
    const int n=10;
    sequenlist r[n+1];
    create(r,n);
    printf("排序前的数据:");
    print(r,n);
    dbubblesort(r,n);
    printf("排序后的数据:");
    print(r,n);
    return 0;
}

//建立顺序表
void create(sequenlist r[],int n)
{
    srand(time(0));
    for(int i=1;i<=n;i++)
        r[i].key=rand()%90;
}

//输出顺序表
void print(sequenlist r[],int n)
{
    for(int i=1;i<=n;i++)
        printf("%5d",r[i].key);
    printf("\n");
}

//双向起泡排序
void dbubblesort(sequenlist r[],int n)
{
    int i=1,j,noswap=1;
    sequenlist temp;
    while(noswap)
    {
        noswap=0;
        for(j=n-i+1;j>=i+1;j--)
        {
            if(r[j].key<r[j-1].key)
            {
                noswap=1;
                temp=r[j];
                r[j]=r[j-1];
                r[j-1]=temp;
            }
        }
        for(j=i+1;j<=n-i;j++)
        {
            if(r[j].key>r[j+1].key)
            {
                noswap=1;
                temp=r[j];
                r[j]=r[j+1];
                r[j=1]=temp;
            }
        }
        for(int k=1;k<=n;k++)
        {
            printf("%5d",r[k].key);
        }
        printf("\n");
        i++;
    }
}

《软件技术基础》实验指导 实验七

标签:基础   ret   time   int   sort   ref   printf   turn   整型   

原文地址:https://www.cnblogs.com/vanlion/p/datastructure-exp-7.html

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