#include<stdio.h>
#include<time.h>
#include <stdlib.h>const int maxx=20010;
int a[11][maxx];void swap(int *x,int *y)
{int z=*x;*x=*y;*y=z;
}
/*--------------插入排序--------------*/
void zjcrsort()//直接插入排序
{int b[11][maxx];for(int i=0;i<10;i++)for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组for(int k=0;k<10;k++){int begin=clock(); int cnt1=0,cnt2=0;//比较次数和移动次数for(int i=1;i<20000;i++){int j=i;int temp=b[k][i];while(j>0&&temp<b[k][j-1])//依次移动数组顺序 {cnt1++,cnt2++;b[k][j]=b[k][j-1];j--;}b[k][j]=temp;}int end=clock();printf("直接插入排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*------------希尔排序-------------*/
void shellsort()//希尔排序
{int b[11][maxx];for(int i=0;i<10;i++)for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组for(int k=0;k<10;k++){int begin=clock();int cnt1=0,cnt2=0;//比较次数和移动次数int gap;for(gap=20000/2;gap>0;gap/=2)//每次的增量,递减趋势{for(int i=gap;i<20000;i++)//每次增量下,进行几组插入排序{for(int j=i;j-gap>=0&&b[k][j-gap]>b[k][j];j-=gap)//每个元素组中进行直接插入排序{swap(&b[k][j-gap], &b[k][j]);cnt1++,cnt2++;//移动和比较次数加一 }}}int end=clock();printf("希尔排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*--------简单选择排序----------*/
void chocsort()//简单选择排序
{int b[11][maxx];for(int i=0;i<10;i++)for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组for(int k=0;k<10;k++){int begin=clock();int cnt1=0,cnt2=0;//比较次数和移动次数for(int i=0;i<200000-1;i++){int _min=i;//记录最小元素位置 for(int j=i+1;j<20000;j++){if(b[k][j]<b[k][_min]){cnt1++;_min=j;//更换最小元素位置 }}if(_min!=i){cnt2++;swap(&b[k][i],&b[k][_min]);//交换位置 }}int end=clock();printf("简单选择排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}}
/*------冒泡排序-------*/
void mpsort()//冒泡排序
{int b[11][maxx];for(int i=0;i<10;i++)for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组for(int k=0;k<10;k++){int begin=clock(); int cnt1=0,cnt2=0;//比较次数和移动次数for(int i=0;i<20000-1;i++)//排序的总轮数 {for(int j=0;j<20000-1-i;j++)//每轮排序的个数{if(b[k][j]>b[k][j+1]){cnt1++;cnt2++;swap(&b[k][j],&b[k][j+1]);}}}int end=clock();printf("冒泡排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*--------快速排序---------*/
void quicksort(int l,int r,int *cnt1,int *cnt2,int xx[][maxx],int k)//快速排序函数
{int i,j,t,temp;if(l>r) return ;//不符合排序条件,直接返回temp=xx[k][l];//temp中存的是基准数i=l;j=r;while(i!=j){//先找右边的数字while(xx[k][j]>=temp&&i<j) j--;//再找左边的数字while(xx[k][i]<=temp&&i<j) i++;if(i<j) swap(&xx[k][i],&xx[k][j]);}xx[k][l]=xx[k][i];xx[k][i]=temp;//最终将基准数归位quicksort(l,i-1,cnt1,cnt2,xx,k);//继续处理左边的,这里是一个递归的过程quicksort(i+1,r,cnt1,cnt2,xx,k);//继续处理右边的 ,这里是一个递归的过程
}
void Qsort()//快速排序
{int b[11][maxx];for(int i=0;i<10;i++)for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组for(int k=0;k<10;k++){int begin=clock();int cnt1=0,cnt2=0;//比较次数和移动次数quicksort(0,9999,&cnt1,&cnt2,b,k);int end=clock();printf("快速排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*------基数排序-------*/
int max(int date[],int n){//此函数用于求解所给数组中最大数有几位int max=0;for(int i=0;i<n;i++){int count=1,tem=date[i];while(tem/10!=0){//计算每个数的位数,用count计数tem=tem/10;count++;}if(count>max)max=count;//把最大位数赋值max}return max;
}
void basesort(int date[],int n){int max1=max(date,n);//取得最大位数int num=1;for(int i=0;i<max1;i++){//位数决定排序循环次数int count[10];//声明count为了统计每个桶放了几个数int temp[10][maxx];//temp相当于桶,前一个数标记第几个篮子,后一个为了标记放的个数for(int f=0;f<10;f++){//对声明数组初始化count[f]=0;}for(int g=0;g<10;g++){//对声明数组初始化for(int z=0;z<n;z++){temp[g][z]=0;}}for(int j=0;j<n;j++){int fg=date[j]/num;//num是变量,因为每次循环比较的位是不同的int k=fg%10;count[k]++;int te=count[k]-1;temp[k][te]=date[j];//把数据放k桶的te位上存储}int b=0;for(int h=0;h<10;h++){if(count[h]>0){//h>0说明h桶内有数字存储for(int v=0;v<count[h];v++){//count[h]是h桶的存储个数date[b]=temp[h][v];//把桶内排好的数全都倒给要排序的数组,进行下轮排序b++;}}}num=num*10;}
}
void Jssort()//基数排序
{int b[maxx];for(int k=0;k<10;k++){for(int i=0;i<20000;i++) b[i]=a[k][i];int begin=clock();basesort(b,20000);int end=clock();printf("基数排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*---------归并排序---------*/
void merge_sort(int *list, int length)
{int i, left_min, left_max, right_min, right_max, next;int *tmp = (int*)malloc(sizeof(int) * length);if (tmp == NULL){fputs("Error: out of memory\n", stderr);abort();}for (i = 1; i < length; i *= 2) // i为步长,1,2,4,8……{for (left_min = 0; left_min < length - i; left_min = right_max){right_min = left_max = left_min + i;right_max = left_max + i;if (right_max > length)right_max = length;next = 0;while (left_min < left_max && right_min < right_max)tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];while (left_min < left_max)list[--right_min] = list[--left_max];while (next > 0)list[--right_min] = tmp[--next];}}free(tmp);
}
void Gbsort()//归并排序
{int b[maxx];for(int k=0;k<10;k++){for(int i=0;i<20000;i++) b[i]=a[k][i];int begin=clock();merge_sort(b,20000);int end=clock();printf("归并排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
/*----------堆排序-----------*/
void heapAdjust(int *b,int s,int len)
{int temp=b[s];for(int j=2*s;j<=len;j*=2){if(j<len && b[j]<b[j+1])j++;if(b[j]>temp){b[s]=b[j];s=j;}elsebreak;}b[s]=temp;
}
void heapSort(int *b,int len)
{for(int i=len/2;i>=1;i--){heapAdjust(b,i,len);}for(int i=len;i>1;i--){swap(&b[1],&b[i]);heapAdjust(b,1,i-1);}
}
void Dsort()//堆排序
{int b[maxx];for(int k=0;k<10;k++){for(int i=0;i<20000;i++) b[i+1]=a[k][i];int begin=clock();heapSort(b,20000);int end=clock();printf("堆排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);}
}
int main()
{freopen("1.txt","r",stdin);//文件输入for(int i=0;i<10;i++)for(int j=0;j<20000;j++) scanf("%d",&a[i][j]);printf("文件读入完成\n");printf("***直接插入排序***\n");zjcrsort();printf("***希尔排序***\n");shellsort();printf("***简单选择排序***\n");chocsort();printf("***冒泡排序***\n");mpsort();printf("***快速排序***\n");Qsort();printf("***基数排序***\n");Jssort();printf("***堆排序***\n");Dsort();printf("***归并排序***\n");Gbsort();return 0;
}

努力加油a啊,(o)/~

八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度相关推荐

  1. 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等

    八大排序算法 一.直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 二.希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 三.简单选择 - 1. ...

  2. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

  3. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  4. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  5. 排序算法:希尔、归并、快速、堆排序

    排序算法 排序是非常常用,非常基本的算法.排序的方法有很多,比如插入排序.选择排序.希尔排序.归并排序.快速排序.堆排序. 本次试验重点实现:希尔排序.归并排序.快速排序.堆排序 插入排序 简单说就是 ...

  6. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

  7. [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序

    手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...

  8. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)

    上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...

  9. 计算机编程语言排序,计算机入门必备算法——选择排序法

    引言 昨天我们学习了二分查找法,但是二分查找法使用的前提必须是有序的数组或者列表,(当然很多的算法都是仅在数据有序的前提下才能使用) 但是在实际工作中,我们接收到的数组不可能都是有序的,那怎么办呢?于 ...

  10. 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)

    [排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...

最新文章

  1. python学习之老男孩python全栈第九期_day004知识点总结
  2. 三款在线css3样式生成工具
  3. php数据库的值嵌入input_求助:问个关于用INPUT提取数据库里的值然后修改的问题。...
  4. r语言在线编译器w3c,R语言运算符知识点总结
  5. 洛谷 P1631 序列合并
  6. MYSQL - 存储过程学习笔记
  7. 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
  8. A Test Checklist
  9. 服务器配置tomcat,使用浏览器访问服务器资源
  10. 4W字全面解读数据中台、数据仓库和数据湖
  11. Arm mini China新公司传预定四月分割Arm中国业务
  12. PHP简约聚合ZB盒子程序源码
  13. html多重阴影效果,如何使用css3实现文字的单阴影效果和多重阴影效果(附完整代码)...
  14. Java修改图片元数据Exif信息
  15. vmware共享文件夹不显示
  16. 基于Web的股票预测系统
  17. 深度学习培训班当天小结1
  18. STVD汇编开发stm8
  19. java中求两个数的最小公倍数,最大公约数的简便方法
  20. 带你理解beta分布

热门文章

  1. mysql5.6.37免安装_mysql5.6免安装配置
  2. 论文阅读:SSD: Single Shot MultiBox Detector
  3. 西山居php面试,西山居面试经验
  4. python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
  5. Android开发之Gradle多渠道打包总结
  6. 计算机考研一些常纹面试知识,2020年光学工程考研复试真题和技巧
  7. ffmpeg编译gb28181_国标GB28181协议视频推流平台EasyGBD在Linux下编译报“UINT64_C在此作用领域中尚未声明”错误...
  8. HTTPS配置全记录
  9. opensuse x64下编译Ice源码(以编译c++为例)
  10. js中cookie操作