当前位置: 首页 > news >正文

排序(选择排序、直接插入排序、冒泡排序、二路归并排序)

如何用多种方式排序数组?(C语言)

一、实验内容:
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[],intn):二路归并排序。
2.调用已编写好的函数实现下列操作:
(1)给定数组 E[N]={213,111,222,77,400,300,987,1024,632,555},调用选择排序函数进行排序;
(2)调用直接插人函数进行排序;
(3)调用冒泡函数进行排序;
(4)调用二路归并排序函数进行排序。

二、实验代码如下:
1.选择排序

#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 )/* e:存储线性表的数组 n:线性表的结点个数 */
{int i, j, k, t;for( i = 0; i < n-1; i++ ) {    /* 控制n−1趟的选择步骤 *//* 在e[i], e[i+1],...,e[n−1]中选键值最小的结点e[k] */for( k = i, j = i + 1; j < n; j++ )if( e[k] > e[j] )k = j;if( k != i ) {      /* e[i]与e[k]交换 */t = e[i];e[i] = e[k];e[k] = t;}}
}void 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();
}

2.直接插入排序

#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 )  /* e:存储线性表的数组  n:线性表的结点个数 */
{int i, j, t;for( i = 1; i < n; i++ ){/* 控制e[i], e[i+1],...,e[n−1]的比较插入步骤 *//* 找结点e[i]的插入位置 */// t = e[i];for(t = e[i]; j >= 0 && t < e[i-1]; j--)e[j+1] = e[j];e[j+1] = t;}
}void 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();

3.冒泡排序

#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 )  /* e:存储线性表的数组  n:线性表的结点个数 */
{int j, p, h, t;for( h = n-1; h > 0; h = p ) {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;}}
}void 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();
}

4.二路归并排序

#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++];elsea[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 + 2 * len - 1;if( s_end >= n )            /* 最后一段可能不足len个结点 */s_end = n - 1;merge_step( e, a, f_s, f_s + len - 1, s_end );  /* 相邻有序段合并 */f_s = s_end + 1;            /* 下一对有序段中左段的开始下标为上一对末尾+1 */}if( f_s < n )                   /* 当还剩一个有序段时, 将其从e[]复制到a[] */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 ) {  /* 交替地在e[]和p[]之间来回合并 */if( f == 0 )merge_pass( e, p, n, len );elsemerge_pass( p, e, n, len );len*=2; /* 一趟合并后,有序结点数加倍 */f = 1 - f;      /* 控制交替合并 */}if( f == 1 )            /* 当经过奇数趟合并时,从p[]复制到e[] */for( f = 0; f < n; f++ )e[f] = p[f];free( p );
}void 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();
}

三、运行结果
1.选择排序
在这里插入图片描述

2.直接插入排序
在这里插入图片描述

3.冒泡排序
在这里插入图片描述
4.二路归并排序
在这里插入图片描述

http://www.dtcms.com/a/553932.html

相关文章:

  • 少儿编程:6-16 岁孩子的思维启蒙与能力进阶之路
  • 10/31作业
  • 前端样式局部作用域:从Scoped到CSS Modules 的完整指南
  • 穆棱建设局网站seo 哪些媒体网站可以发新闻
  • 物联网卡摄像头从前端至后台的实现过程
  • 整合多中心临床试验的转录组与病理切片数据,提出面向晚期非小细胞肺癌免疫治疗疗效预测的解决方案
  • 【计算机网络】考研408计算机网络:传输介质(导向/非导向)考点梳理
  • 网站开发合同适用印花税互联网专业主要学什么
  • iFluor 594 Styramide,水溶性荧光探针
  • 零基础网站建设及维护视频课程东莞有哪些好的网站建设公司
  • (151页PPT)大型制造集团十五五产业数字化转型规划方案(附下载方式)
  • 新能源硬件架构设计前沿:DFX思维如何平衡可靠性、成本与可维护性
  • 跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
  • Go环境搭建(vscode调试)
  • 宜兴做网站哪个好南充市建设局官方网站
  • 网站建设 交单流程wordpress收录
  • STM32的DH11温湿度模块和LED灯的综合实训
  • 模型微调实现案例分析
  • Blender云渲染农场怎么收费?渲一个一分钟的Blender动画需要多少钱?
  • 搜狐登陆password参数逆向
  • 官宣:Ray 正式加入 PyTorch 基金会
  • 惠州网站设计培训什么网站可以接模具做
  • 进入这个网站宽屏网站源码
  • 【学习笔记】强化学习从原理到实践
  • SIMATIC HMI Operator Panels: Unified Comfort Panels西门子面板固件更新下载
  • 张家港网站开发培训广告代理网页设计代码开头
  • 白云怎样优化网站建设建设微信网站设计制作
  • [人工智能-大模型-124]:模型层 - 用通俗易懂的语言,阐述RNN网络的数学问题与数学根因
  • PVE 虚拟机防火墙设置
  • 深度学习参数优化