八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度
#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)/~
八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度相关推荐
- 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等
八大排序算法 一.直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 二.希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 三.简单选择 - 1. ...
- 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...
八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...
- 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...
- 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...
排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...
- 排序算法:希尔、归并、快速、堆排序
排序算法 排序是非常常用,非常基本的算法.排序的方法有很多,比如插入排序.选择排序.希尔排序.归并排序.快速排序.堆排序. 本次试验重点实现:希尔排序.归并排序.快速排序.堆排序 插入排序 简单说就是 ...
- 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序
[简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...
- [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序
手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...
- 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)
上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...
- 计算机编程语言排序,计算机入门必备算法——选择排序法
引言 昨天我们学习了二分查找法,但是二分查找法使用的前提必须是有序的数组或者列表,(当然很多的算法都是仅在数据有序的前提下才能使用) 但是在实际工作中,我们接收到的数组不可能都是有序的,那怎么办呢?于 ...
- 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)
[排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...
最新文章
- python学习之老男孩python全栈第九期_day004知识点总结
- 三款在线css3样式生成工具
- php数据库的值嵌入input_求助:问个关于用INPUT提取数据库里的值然后修改的问题。...
- r语言在线编译器w3c,R语言运算符知识点总结
- 洛谷 P1631 序列合并
- MYSQL - 存储过程学习笔记
- 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
- A Test Checklist
- 服务器配置tomcat,使用浏览器访问服务器资源
- 4W字全面解读数据中台、数据仓库和数据湖
- Arm mini China新公司传预定四月分割Arm中国业务
- PHP简约聚合ZB盒子程序源码
- html多重阴影效果,如何使用css3实现文字的单阴影效果和多重阴影效果(附完整代码)...
- Java修改图片元数据Exif信息
- vmware共享文件夹不显示
- 基于Web的股票预测系统
- 深度学习培训班当天小结1
- STVD汇编开发stm8
- java中求两个数的最小公倍数,最大公约数的简便方法
- 带你理解beta分布
热门文章
- mysql5.6.37免安装_mysql5.6免安装配置
- 论文阅读:SSD: Single Shot MultiBox Detector
- 西山居php面试,西山居面试经验
- python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
- Android开发之Gradle多渠道打包总结
- 计算机考研一些常纹面试知识,2020年光学工程考研复试真题和技巧
- ffmpeg编译gb28181_国标GB28181协议视频推流平台EasyGBD在Linux下编译报“UINT64_C在此作用领域中尚未声明”错误...
- HTTPS配置全记录
- opensuse x64下编译Ice源码(以编译c++为例)
- js中cookie操作