关于几种排序的结题报告
来源:互联网 发布:香港电影经典台词 知乎 编辑:程序博客网 时间:2024/04/30 00:24
最近整理了一些关于排序的算法,其中包括快排,简单插入排序,冒泡排序,选择排序,折半插入排序。
简单插入排序思想:
认为开始时数组第一个元素有序,随后依次向后扫描元素K,过程中有序的数组从后往前扫描,
若K比前一个元素小,则让元素向后移,直到K大于的元素处停止,此时K应放在此元素后面。
代码如下:
#include<stdio.h>void insertsort(int *a,int n)//排序{ int i,j,m; for(i=1;i<n;i++)//默认第一个元素有序,从第二个开始依次向后扫描 { for(m=a[i],j=i;j>0&&a[j-1]>m;j--)//如果有序元素从后向前扫描,直到找到小于m的元素位置 //并且此过程中每个元素后移,最后找到m的位置 { a[j]=a[j-1]; } a[j]=m; }}main(){ int a[10],i; for(i=0;i<10;i++) scanf("%d",a+i); insertsort(a,10); for(i=0;i<10;i++) printf("%d",a[i]);}冒泡排序思想:
冒泡排序就是根据鱼吐泡泡的原理,大数往下沉,首先让最大的沉到最低端,然后就不再考虑它,
依次重复此操作,排序完成。
代码如下:
#include<stdio.h>void popsort(int *a,int n){ int i,j,k; for(i=0;i<n-1;i++)//从第一个元素开始直到倒数第二个,最后一个元素不用比较 { for(j=0;j<n-1-i;j++)//从第一个元素开始依次与后面的元素作比较,大数向下沉, //沉下去的就不再进行比较 { if(a[j]>a[j+1])//大数向下沉进行交换 { k=a[j]; a[j]=a[j+1]; a[j+1]=k; } } }}main(){ int a[10]={1,4,3,7,9,5,0,2,6,8},i; popsort(a,10); for(i=0;i<10;i++) printf("%d",a[i]);}
折半插入思想:
对简单插入的优化,减少了比较次数,即比较时首先比较中间元素,以此类推。
代码如下:
#include<stdio.h>void binsearch(int *a,int n){ int i,j,k,m,low,high; for(i=1;i<n;i++)//第一个元素默认有序,从第二个元素开始一次扫描比较 { low=0;//有序元素的头 high=i-1;//有序元素的尾 while(low<=high)//直到low>high时即找到了此元素的位置 { m=(low+high)/2;//m为元素的中间位置 if(a[m]>a[i])//m把有序元素分成了两半,看看a[i]处于哪一半 high=m-1; else low=m+1; } for(k=a[i],j=i;j>low;j--)//然后从a[i]前面的元素到low的位置处依次向后移 a[j]=a[j-1]; a[low]=k;//low的位置就是元素的位置 }}main(){ int a[10],i; for(i=0;i<10;i++) scanf("%d",a+i); binsearch(a,10); for(i=0;i<10;i++) printf("%d",a[i]);}选择排序思想:
依次扫描元素0<=K<=n,并且将元素与后面的所有元素进行比较,找到较大元素的坐标,
如果K!=I,即最大元素的位置不是I,而是K,进行交换。
代码如下:
#include<stdio.h>void chosesort(int *a,int n)//传入数组和个数{ int i,j,k,m; for(i=0;i<n-1;i++)//从第一个依次向后扫描 { k=i;//记录元素的位置 for(j=i+1;j<n;j++)//从此位置后面的元素开始依次扫描,找到较大的元素位置 //并将其付给 K { if(a[k]>a[j]) { k=j; } } if(k!=i)//如果K与I不同说明I在K位置的元素大于I位置的元素,因此交换 { m=a[k]; a[k]=a[i]; a[i]=m; } }}main(){ int a[10],i; for(i=0;i<10;i++) scanf("%d",a+i); chosesort(a,10); for(i=0;i<10;i++) printf("%d ",a[i]);}
快排思想:
快排主要是将以第一个元素为键值,即分界点,后面元素依次与制作比较,
大于它的在右边,小于它的在左边,而后左右两边再次运用此方法,递归。
代码如下:
#include<stdio.h>int a[10]={1,3,2,6,8,9,7,4,5,0};void sort(int *a,int x,int y)//传入数组的首位及末尾下标{ int i=x,j=y,k;//I 为左端点,J为右端点 k=a[i];//第一个元素设为键值,即中间元素 if(i>=j)//如果数组不成立,返回 return; while(i!=j)//当I!=J时 { while(i<j&&k<=a[j])//保证I<J,从右端点开始扫描,直到找到小于键值的元素 //并且过程中J要减一 j--; a[i]=a[j];//然后将其付给第一个元素 while(i<j&&k>a[i])//再从第二个元素开始扫描,直到找到大于键值的元素为止 //并将其付给末尾元素 i++; a[j]=a[i]; } a[i]=k;//键值付给中间元素 sort(a,x,i-1);//对左右部分分别递归调用 sort(a,i+1,y);}int main(){ int i; for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); sort(a,0,9); for(i=0;i<10;i++) printf("%d",a[i]); return 0;}
0 0
- 关于几种排序的结题报告
- 关于插入排序的几种实现
- 关于几种排序算法的理解
- 关于NSArray的几种排序:
- 关于排序的几种练习.
- 关于排序的几种算法
- 关于BUG报告的几点
- 持续更新关于几种排序方式的的问题......
- 关于对常见的几种排序的理解。
- 关于冒泡排序算法的几种实现
- 关于JAVA的几种排序算法研究
- 关于几种简单的排序算法-插入、冒泡、选择
- 关于几种排序的个人整理及分析
- 关于c语言几种排序方法的理解
- 关于几种排序的时间复杂度和空间复杂度
- 关于冒泡排序的几点想法
- 关于火车进站的结题报告
- 转载:关于报告绩效过程的几点解读
- Ubuntu网络配置静态IP与hostname使用命令
- 客户端javascript之window
- 基础总结篇之五:BroadcastReceiver应用详解
- hook其他进程的API
- 模板类中的静态变量,用于继承时子类的静态变量的独占
- 关于几种排序的结题报告
- SQLite学习手册(目录)
- C# datatable使用groupby进行分组统计
- webkit之RenderTheme
- 客户端javascript之脚本化文档
- !男孩忍不住内心的伤痛决定要弄清楚到底为了什么
- nginx配置
- 设计模式(6):模版方法模式
- Opening Up a Web Browser with Python