首页 > 编程语言 >算法与数据结构实验六 内部排序

算法与数据结构实验六 内部排序

时间:2022-12-12 15:33:27浏览次数:33  
标签:排序 int void elem 算法 low SqList 数据结构

实验项目名称:实验    内部排序 

一、 实验目的

1.掌握插入排序的方法及效率分析
2.掌握选择排序的方法及效率分析
3.掌握交换排序的方法及效率分析
4.掌握归并排序的方法及效率分析

二、 实验内容

6-4 快速排序

本题要求实现快速排序的一趟划分函数,待排序列的长度1<=n<=1000。

函数接口定义:

int Partition ( SqList L, int low,  int high );

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       int Length;      }SqList;void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ int Partition ( SqList  L,int low,  int  high );void Qsort ( SqList  L,int low,  int  high );int main(){  SqList L;  int i;  CreatSqList(&L);  Qsort(L,1,L.Length);  for(i=1;i<=L.Length;i++)      printf("%d ",L.elem[i]);  return 0;}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 );     }}/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10

5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

6-5 堆排序

本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。

函数接口定义:

void HeapAdjust( HeapType  H, int s, int m);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;typedef SqList HeapType; 

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;typedef SqList HeapType; void  CreatSqListHeapType *L);/*待排序列建立,由裁判实现,细节不表*/ void HeapAdjust( HeapType  H, int s, int m);void HeapSort( HeapType  H);int main(){  HeapType L;  int i;  CreatSqList(&L);  HeapSort(L);  for(i=1;i<=L.Length;i++)   {             printf("%d ",L.elem[i]);   }  return 0;}void HeapSort( HeapType  H){ /*堆顺序表H进行堆排序*/  int i; KeyType rc;  /*建立初始堆*/  for( i=H.Length/2;i>0; i--)   {      HeapAdjust(H, i, H.Length);   }  for(i=H.Length;i>1;i--)   {      rc=H.elem[1];      H.elem[1]=H.elem[i];       H.elem[i]=rc;      HeapAdjust(H, 1, i-1);    } }/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10

5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

6-6 归并排序

本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000。

函数接口定义:

void Merge(SqList L,int low,int m,int high);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

#include<stdio.h>#include<stdlib.h>typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ void  MergeSort(SqList L,int low,int high);void Merge(SqList L,int low,int m,int high); int main(){  SqList L;  int i;  CreatSqList(&L);  MergeSort(L,1,L.Length);  for(i=1;i<=L.Length;i++)   {              printf("%d ",L.elem[i]);   }  return 0;}void MergeSort(SqList L,int low,int high)  {         /*用分治法进行二路归并排序*/      int mid;      if(low<high)  /*区间长度大于1*/    {              mid=(low+high)/2;               /*分解*/        MergeSort(L,low,mid);           /*递归地对low到mid序列排序 */         MergeSort(L,mid+1,high);        /*递归地对mid+1到high序列排序 */         Merge(L,low,mid,high);          /*归并*/      }  }/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10

5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

6-7 直接插入排序

本题要求实现直接插入排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

void  InsertSort(SqList L);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ void  InsertSort(SqList L);int main(){  SqList L;  int i;  CreatSqList(&L);  InsertSort(L);  for(i=1;i<=L.Length;i++)   {              printf("%d ",L.elem[i]);    }  return 0;}/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10

5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

 

6-8 希尔排序的实现

本题要求实现一趟希尔排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

void  ShellInsert(SqList L,int dk);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedef  int  KeyType;typedef  struct {                        KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                         int Length;      }SqList;void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ void  ShellInsert(SqList L,int dk);void  ShellSort(SqList L);int main(){  SqList L;  int i;  CreatSqList(&L);  ShellSort(L);  for(i=1;i<=L.Length;i++)   {             printf("%d ",L.elem[i]);   }  return 0;}void   ShellSort(SqList L){  /*按增量序列dlta[0…t-1]对顺序表L作Shell排序,假设规定增量序列为5,3,1*/   int k;   int dlta[3]={5,3,1};   int t=3;   for(k=0;k<t;++k)       ShellInsert(L,dlta[k]);} /*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10

5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

三、 设计文档

 

 

 

 

 

 

四、 源程序

1.

int Partition ( SqList  L,int low,  int  high ){

  int temp=L.elem[low];

  while(low<high)

  {

    while(low<high&&L.elem[high]>=temp){

      high--;

    }

    if(low<high){

      L.elem[low]=L.elem[high];

      low++;

    }

    while(low<high&&L.elem[low]<temp){

      low++;

    }

    if(low<high){

      L.elem[high]=L.elem[low];

      high--;

    }

    

  }L.elem[low]=temp;

  return low;

}

 

2.

void HeapAdjust( HeapType  H, int s, int m){

 KeyType a;

 int i;

 a=H.elem[s];

    for(i=2*s;i<=m;i*=2){

  if(i<m&&H.elem[i]<H.elem[i+1]) ++i; 

        if(a>=H.elem[i]) break;

  H.elem[s]=H.elem[i]; s=i; 

    }

 H.elem[s]=a; 

}

 

3.

void Merge(SqList L,int low,int m,int high){

int i,j,now;

i=low;

j=m+1;

now=1;

int a[10000];//开个数组保存中间比较过程

while (i<=m&&j<=high){

if(L.elem[i]<=L.elem[j]){

a[now++]=L.elem[i++];

}

else{

a[now++]=L.elem[j++];

}

}

while (i<=m) a[now++]=L.elem[i++];

while (j<=high) a[now++]=L.elem[j++];

for (i=low,now=1;i<=high;i++){

L.elem[i]=a[now++];

}

}

 

4.

void  InsertSort(SqList L){

  int i,j;

  for(i=1;i<=L.Length;i++){

    L.elem[0]=L.elem[i];

    for(j=i;L.elem[j-1]>L.elem[0]&&j>0;j--)

    L.elem[j]=L.elem[j-1];

    L.elem[j]=L.elem[0];

  }

}

5.

void  ShellInsert(SqList L,int dk){

    

    for(int i=dk+1;i<=L.Length;i++){//elem[0]是哨兵

        if(L.elem[i-dk]>L.elem[i]){

            L.elem[0]=L.elem[i-dk];

            L.elem[i-dk]=L.elem[i];

            L.elem[i]=L.elem[0];

            i=dk+1;

        }

    }

}

 

标签:排序,int,void,elem,算法,low,SqList,数据结构
From: https://www.cnblogs.com/DREAM2021/p/16976183.html

相关文章

  • 卡尔曼滤波算法-通俗理解
    简单来说,卡尔曼滤波器是一个“optimalrecursivedataprocessingalgorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广......
  • TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)
    首先很幸运拿到TIANCHI天池-OGeek算法挑战赛大赛的亚军,同时非常感谢大佬队友的带飞,同时希望我的分享与总结能给大家带来些许帮助,并且一起交流学习。(作者:王贺,知乎:鱼遇雨欲语......
  • 每日算法之把数组排成最小的数
    JZ45把数组排成最小的数描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三......
  • 第一章算法概述总结
    代码规范类及其排版格式声明属性依次序是public:、protected:、private:。关键字public,protected,private不要缩进,声明的函数和变量缩进一个制表符。类声明前应加上注释,注......
  • 常见数据结构与算法的Python实现
    有人问我数据结构与算法怎么学?怎么用Python实现常见的数据结构算法?我找到一个github标星66.6k+的仓库,把各种常见算法用Python实现了,而且还有动图演示,非常值得推荐。(黄海广)仓......
  • 推荐:常见算法的python实现(github上25000多star)
    近日在github上发现一个25000多star的仓库,把各种常见算法用python实现了,而且还有动图演示,非常值得推荐。仓库说明这个仓库用python语言实现了绝大部分算法,主要是用于教学目......
  • 《3D计算机视觉:原理、算法及应用》一本全搞定
       1966年,人工智能学家Minsky在给学生布置的作业中,要求学生通过编写一个程序让计算机告诉我们它通过摄像头看到了什么,这也被认为是计算机视觉(ComputerVision,CV)最早的......
  • 冒泡排序
    voidbubble_sort(intarr[],intn){ inti,j,tmp; for(i=0;i<n;i++) { intflag=1; for(j=0;j<n-1-i;j++)//n个元素,两两对比, //只需要进行n-1次......
  • 数据算法之数据结构
      packagecom.Lucky.DataStructure;/*数据结构:逻辑结构+储存结构+储存结构的运算逻辑结构分为:线性结构1:1树状结构......
  • 根号数据结构
    坑:补所有题目的代码:口胡的正确性应该都没问题,关键是如何实现得优美一点常数比较小能过。【Ynoi2015】盼君勿忘末尾处的复杂度证明。树上分块章节。【Ynoi2006......