实验十 内部排序

一、实验目的
1.熟悉并掌握各种排序方法的设计思路。
2.掌握各种具体排序算法在计算机上的实现。
3.掌握各种排序方法的性能比较。

二、实验内容
1.直接插入排序、冒泡排序和简单选择排序算法实现,分析各种方法进行排序时对关键字的比较次数和移动次数。
2.快速排序算法的实现。

三、实验要求
1.直接插入排序、冒泡排序和简单选择排序算法实现。(1)设哈希表长为20,用除留余数法构造一个哈希函数。
(1)输入同样一组整型数据,作为待排序记录的关键字序列。
(2)实现直接插入排序算法,输出排序后结果。
(3)实现冒泡插入排序算法,输出排序后结果。
(4)实现简单选择排序算法,输出排序后结果。

2.快速排序算法的实现。
(1)输入一组整型数据,作为待排序记录的关键字序列。
(2)实现快速排序算法,输出排序后结果。

四、详细程序清单

//排序 
#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 20
#define INFINITY 0x7FFFFFFF //定义最大值∞

typedef int KeyType;
typedef int InfoType;
typedef struct{
    KeyType key;
    InfoType otherinfo;
}RedType;
typedef struct{
    RedType r[MAXSIZE+1];
    int length;
}SqList;

void InsertSort(SqList &L)//直接插入排序 
{
    int i,j;
    for(i=2;i<=L.length;i++)
        if(L.r[i].key<L.r[i-1].key)
        {
            L.r[0]=L.r[i];
            L.r[i]=L.r[i-1];
            for(j=i-2;L.r[0].key<L.r[j].key;j--)
                L.r[j+1]=L.r[j];
            L.r[j+1]=L.r[0];    
        }   
}

void BubbleSort(SqList &L)//冒泡插入排序
{
    int i,j,temp;
    for(i=1;i<=L.length;i++)
        for(j=1;j<=L.length-i;j++)
            {
                if(L.r[j].key>L.r[j].key)
                {
                    temp=L.r[j].key;
                    L.r[j].key=L.r[j].key;
                    L.r[j].key=temp;
                }
            }   
}

int SelectMinKey(SqList L,int i)//选择最小值 
{
    int min=INFINITY;
    for(i;i<=L.length;i++)
        {
            if(L.r[i].key<INFINITY)
            min=L.r[i].key;
        }
    return min; 
}

void BSelectSort(SqList &L)//简单选择排序
{
    int i,j,temp;
    for(i=1;i<=L.length;i++)
    {
        j=SelectMinKey(L,i);
        if(i!=j)
        {
            temp=L.r[j].key;
            L.r[j].key=L.r[j].key;
            L.r[j].key=temp;            
        }
    }
}

int Partition(SqList &L,int low,int high)//快速排序
{
    int pivotkey;
    L.r[0]=L.r[low];
    pivotkey=L.r[low].key;
    while(low<high)
    {     
        while(low<high&&L.r[high].key>=pivotkey) --high;
        L.r[low]=L.r[high];
        while(low<high&&L.r[low].key<=pivotkey)  ++low;
        L.r[high]=L.r[low];
    }
    L.r[low]=L.r[0];   
    return low;
}

void QSort(SqList &L,int low,int high)//快速排序 
{
    int pivotloc;
    if(low<high) 
    {
        pivotloc=Partition(L,low,high);
        QSort(L,low,pivotloc-1); 
        QSort(L,pivotloc+1,high);
    }
}

void QuickSort(SqList &L)
{
    QSort(L,1,L.length); 
}

void Show(SqList L)//显示 
{
    for(int i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}

int main()
{
    SqList L;
    printf("输入长度:");
    scanf("%d",&L.length);
    printf("输入元素:");
    for(int i=1;i<=L.length;i++)
        scanf("%d",&L.r[i].key);
    InsertSort(L);
    printf("直接插入排序结果:");
    Show(L);
    BubbleSort(L);
    printf("\n冒泡插入排序结果:");
    Show(L);
    BSelectSort(L);
    printf("\n简单插入排序结果:");
    Show(L);
    QuickSort(L);
    printf("\n快速排序结果:    ");
    Show(L);
} 

五、程序运行结果
这里写图片描述

六、实验心得体会
1.本次作业总共使用了四种排序方法,使我更加深刻地认识到了四中不同排序算法的差别和优劣。
2.快速排序虽然难以理解,却是效率最高的排序算法,须牢牢掌握。
3.这是最后一次写实验报告了,回首这一学期,感触良多。我本来就很喜欢编程,也打ACM,但是刚开始接触《数据结构》这本书的时候还是觉得晦涩难懂,不过随着逐渐的学习,越来越能感受到这本书的美妙。一学期的锻炼让我梳理清楚了数据的结构,对原来不常用的算法进行了查漏补缺,尤其是编程风格得到了很大提高。但我还有很多很多不足:书上有些代码的写法我依然不能很好的理解;我经常为了省事滥用全局变量;函数的嵌套有时复杂繁乱;代码风格不统一:大小写用法不统一,变量名、函数名不统一,有时候觉得这样写好,有时又觉得那样写好。
4.学习编程的道路还很长很长,以后会更加努力!

猜你喜欢

转载自blog.csdn.net/aaakkk_1996/article/details/79187683