前言

各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
基本要求:
(1) 从以下常用的内部排序算法至少选取5种进行比较:直接插入排序;折半折入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序。
(2) 待排序表的表长为20000;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。

直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 20000
typedef struct SORTTYPE
{char name[30]; //排序名称int num_compare;       //比较的次数int num_move;       //移动的次数
} ST;        //存储分析效率的数据
int num_compare = 0, num_move = 0; //关键字比较和移动的次数
ST st[5];                 //五种算法的分析数据
//直接插入排序算法
void InsertSort(int a[], int n);
//折半插入排序法
void BinInsertSort(int a[], int n);
//希尔排序算法
void ShellSort(int a[], int n);
//冒泡排序算法
void BubbleSort(int a[], int n);
/*快速排序算法*/
int partition(int a[], int s, int t); //一趟划分
//对a[s..t]的元素进行快速排序
void QuickSort(int a[], int s, int t);
//菜单
void menu();
//调用直接插入排序的实现函数,即菜单1
void op1(int a[]);
void op2(int a[]);
void op3(int a[]);
void op4(int a[]);
void op5(int a[]);
void op6(int a[]);
//打印数组数据
void printArray(int a[]);
//给数组生成随机数
void GetaandArray(int a[]);
//五种常见的算法
///
//直接插入排序算法
void InsertSort(int a[], int n)
{int i, j;int tmp;for (i = 1; i < n; i++) //for循环内一定比较了n-1次,if判断语句{if (a[i] < a[i - 1]) //一旦出现了逆序的关键字,就进行插入{tmp = a[i];j = i - 1;num_compare++;do //往后移动一个位置,腾空间给tmp;{a[j + 1] = a[j];num_move++; //移动加一j--;num_compare++; //比较次数加一}while (j >= 0 && a[j] > tmp);a[j + 1] = tmp; //最后把tmp放在对应的位置num_move += 2;  //移动的temp}}
}

//折半插入排序法
//把无序区插入到有序区里,由于前面的插入排序法实现了有序,所以直接在
//有序区利用折半查找来寻找的改进算法
void BinInsertSort(int a[], int n)
{int i, j, low, high, mid;int tmp;for (i = 1; i < n; i++) //已经比较了n-1次{if (a[i] < a[i - 1]){tmp = a[i];low = 0;high = i - 1;num_compare++;while (low <= high){num_compare++; //while进入比较mid = (low + high) / 2;if (tmp < a[mid])high = mid - 1;elselow = mid + 1;}for (j = i - 1; j >= high + 1; j--){a[j + 1] = a[j];num_move++; //移动次数加一}a[high + 1] = tmp;num_move += 2; //tmp交换}}
}
///
//希尔排序算法
void ShellSort(int a[], int n)
{int i, j, d;int tmp;d = n / 2;while (d > 0){for (i = d; i < n; i++){tmp = a[i];j = i - d;while (j >= 0 && tmp < a[j]){num_compare++;num_move++;a[j + d] = a[j];j = j - d;}a[j + d] = tmp;num_move += 2; //tmp进行两次操作}d = d / 2;}
}
///
//冒泡排序算法
void BubbleSort(int a[], int n)
{int i, j;int tmp;for (i = 0; i < n - 1; i++){for (j = n - 1; j > i; j--)if (a[j] < a[j - 1]){num_compare++;num_move += 3;tmp = a[j - 1];a[j - 1] = a[j];a[j] = tmp;}}
}
/
/*快速排序算法*/
int partition(int a[], int s, int t) //一趟划分
{int i = s, j = t;int tmp = a[i]; //以a[i]为基准while (i < j)   //从两端交替向中间扫描,直至i=j为止{while (j > i && a[j] >= tmp){j--;           //从右向左扫描,找一个小于tmp的a[j]num_compare++; //进行比较}a[i] = a[j]; //找到这样的a[j],放入a[i]处num_move++;  //移动+1while (i < j && a[i] <= tmp){i++;           //从左向右扫描,找一个大于tmp的a[i]num_compare++; //比较加一}a[j] = a[i]; //找到这样的a[i],放入a[j]处num_move++;  //移动加一}a[i] = tmp;num_move += 2; //temp的交换return i;
}void QuickSort(int a[], int s, int t)
//对a[s..t]的元素进行快速排序
{int i;if (s < t) //区间内至少存在两个元素的情况{i = partition(a, s, t);QuickSort(a, s, i - 1); //对左区间递归排序QuickSort(a, i + 1, t); //对右区间递归排序}
}
/void menu()
{printf("***************************************************\n");printf("\t\t1.直接插入排序法\n");printf("\t\t2.折半插入排序法\n");printf("\t\t3.希尔排序法\n");printf("\t\t4.冒泡排序法\n");printf("\t\t5.快速排序法\n");printf("\t\t6.效率比较\n");printf("\t\t7.退出\n");printf("***************************************************\n");printf("请选择操作:");
}
void printArray(int a[]) //打印数组数据
{int i;for (i = 0; i < MAX; i++)printf("%2d%c", a[i], (i+1)%40 ? ' ' : '\n');putchar(10);
}//调用直接插入排序的实现函数,即菜单1
void op1(int a[])
{GetaandArray(a);printf("伪随机数已经生成的20000个新的随机数\n");//打印排序前的数组// printArray(a);InsertSort(a, MAX);// printf("\n利用直接插入排序后的数列如下:\n");//打印排序后的数组// printArray(a);printf("\n\n直接插入排序法:\n一共比较了%d次,移动了%d次\n", num_compare, num_move);st[0].num_compare = num_compare;st[0].num_move = num_move;strcpy(st[0].name, "直接插入排序");
}
void op2(int a[])
{GetaandArray(a);printf("已经生成20000个新的随机数\n");//打印排序前的数组//  printArray(a);num_compare = 0;num_move = 0;BinInsertSort(a, MAX);//  printf("\n利用折半插入排序后的数列如下:\n");//打印排序后的数组// printArray(a);printf("\n\n折半插入排序:\n一共比较了%d次,移动了%d次\n", num_compare, num_move);st[1].num_compare = num_compare;st[1].num_move = num_move;strcpy(st[1].name, "折半插入排序");
}void GetaandArray(int a[]) //为数组获得随机数
{int i;for (i = 0; i < MAX; i++)a[i] = rand() % 100;
}
void op3(int a[])
{GetaandArray(a);printf("已经生成20000个新的随机数\n");//打印排序前的数组//printArray(a);num_compare = 0;num_move = 0;ShellSort(a, MAX);//printf("\n利用希尔排序算法后的数列如下:\n");//打印排序后的数组//printArray(a);printf("\n\n希尔排序算法:\n一共比较了%d次,移动了%d次\n", num_compare, num_move);st[2].num_compare = num_compare;st[2].num_move = num_move;strcpy(st[2].name, "希尔排序算法");
}
void op4(int a[])
{GetaandArray(a);printf("已经生成20000个新的随机数\n");//打印排序前的数组// printArray(a);num_compare = 0;num_move = 0;BubbleSort(a, MAX);//  printf("\n利用冒泡排序法后的数列如下:\n");//打印排序后的数组//  printArray(a);printf("\n\n冒泡排序算法:\n一共比较了%d次,移动了%d次\n", num_compare, num_move);st[3].num_compare = num_compare;st[3].num_move = num_move;strcpy(st[3].name, "冒泡排序算法");
}
void op5(int a[])
{GetaandArray(a);printf("已经生成20000个新的随机数\n");//打印排序前的数组//printArray(a);num_compare = 0;num_move = 0;QuickSort(a, 0, MAX);//  printf("\n利用快速排序算法后的数列如下:\n");//打印排序后的数组// printArray(a);printf("\n\n快速排序算法:\n一共比较了%d次,移动了%d次\n", num_compare, num_move);st[4].num_compare = num_compare;st[4].num_move = num_move;strcpy(st[4].name, "快速排序算法");
}
void op6(int a[])
{int i;printf("各种排序算法的比较于移动次数的对比:\n\n");printf("   名称          比较次数          移动次数\n");for (i = 0; i < 5; i++){printf("%-18s%-18d %d\n", st[i].name, st[i].num_compare, st[i].num_move);}
}
int main()
{int a[MAX]; //列表数组int op;srand((unsigned)time(NULL)); //随机种子do{system("cls");menu();scanf("%d", &op);switch (op){case 1:op1(a);break;case 2:op2(a);break;case 3:op3(a);break;case 4:op4(a);break;case 5:op5(a);break;case 6:op6(a);break;default:break;}system("pause");}while(op!=7);return 0;
}

效果图

《数据结构》之内部排序算法比较相关推荐

  1. 数据结构之内部排序算法总结笔记

    内部排序算法  排序的基本概念: 把一组无序的数据元素按照关键字值递增(或递减)的顺序重新排列.  一.插入排序 思想:将序列分为[有序段]与[无序段]两段,然后依次将[无序段]中的元素插入到[有序段 ...

  2. 《数据结构》--内部排序算法比较

    题目 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间.试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受. 基本要求: (1) 从以下常用的内部排 ...

  3. 数据结构实验:内部排序算法的性能分析

    文章目录 前言 一.问题描述 二.问题分析 三.实验结果及分析 (1)实验数据描述 (2)实验结果 (3)性能分析 四.源代码 前言 记录下本学期的数据结构实验 本实验主要集中于比较几种内部排序算法 ...

  4. 数据结构之排序算法:内部排序算法的应用与比较

    排序算法:内部排序算法的应用与比较 思维导图: 比较: 应用: 思维导图: 比较: 应用:

  5. 内部排序算法比较-数据结构C语言课设

    名称:内部排序算法比较 内容:在教科书中,各种内部排序算法的时间复杂的分析结果只给出了算法执行时间的阶,或大概执行时间.试通过随机数据比较各种算法的关键字比较次数和关键字移动次数,以取得直观感受. 任 ...

  6. 九大内部排序算法(快速排序、归并排序、堆排序、希尔排序、基数排序)

    排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列. 文章目录 由于待排序的记录数量不同,使得排序过程中涉及的存储器 ...

  7. 超详细!各种内部排序算法的比较

    先来个表格总结直观展示下: 各种内部排序算法的性质            算法种类                    时间复杂度  空间复 杂度 稳定性 最好情况 平均情况 最坏情况 插入排序 直 ...

  8. 飞鸽传书内部排序算法的性能比较

    部排序算法的性能比较 飞鸽传书内部排序算法的性能比较 1)排序的稳定性及分析: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=r ...

  9. 数据结构十大排序算法(python)

    十大经典排序算法 (java实现看这个)https://program.blog.csdn.net/article/details/83785159 名词解释: 1.冒泡排序 2.选择排序 3.插入排 ...

最新文章

  1. ZW网络团队及资源简介
  2. 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的...
  3. GNS3 cloud 连接错误_远程桌面连接服务器身份验证错误要求的函数不受支持
  4. CALL TRANSACTION - bdc_options
  5. 程序左上角的字_微信内测7.0.7新版本,小程序迎来大改动!
  6. Adob Flash Professional CS6发布Android手机应用报异常
  7. linux source多个文件夹,linux下source命令使用详解
  8. iOS录音及播放全解
  9. web渗透学习目录-新手打开思路
  10. 常用的vim命令,主要是写给宝贝儿方便工作查看的
  11. 实时互联网的隐形风口
  12. 【网络资源学习笔记】ShellCode相关内容学习
  13. 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?
  14. 从word2vec开始,说下GPT庞大的家族系谱
  15. 单片机的智能垃圾桶设计
  16. C语言中EOF的应用
  17. PTA 2022秋季C语言专题实验07
  18. 计算机考试用到的英语词汇,BEC商务英语_计算机英语高级词汇·软件篇_沪江英语...
  19. android 启动3d加速,内置显卡 六款支持3D加速安卓手机推荐
  20. 西乔,那位集才华与美貌于一身的女纸,IT男的梦中女神,后来怎么样了?

热门文章

  1. 操作系统PV操作-王道课后第9题
  2. 树的应用 —— 树的存储
  3. 计算机专业有身高限制吗,大学哪些专业对身高要求?高中生注意,这些专业差1cm都不能报...
  4. Leetcode刷题日记(一)
  5. vue加载页面实时显示判断是上午下午还是晚上
  6. 将内网映射到公网【无需公网IP】
  7. 新型机器人闯入职场:到底是工作缔造者还是工作终结者?--华盛顿邮报
  8. 各种安装包打包发布工具
  9. PyCharm快捷键大全(windows+mac)
  10. python对字典进行排序