几种简单的排序算法
2015-10-26 15:15
337 查看
整理了一下几种简单的排序算法,暂时先贴上算法,以后有时间在一个一个注释
参考:http://www.360doc.com/content/14/0804/11/1073512_399302715.shtml
http://blog.csdn.net/han_xiaoyang/article/details/12163251
下面是代码部分:
参考:http://www.360doc.com/content/14/0804/11/1073512_399302715.shtml
http://blog.csdn.net/han_xiaoyang/article/details/12163251
下面是代码部分:
#include <iostream> //算法1:冒泡排序,时间复杂度O(n^2) //基本思想:从最后一个数开始,每次相邻两个数字比较,较小数往上浮动 void BubbleSort(int *a,int c) { int temp; for(int i=0;i<c-1;i++) { for(int j=c-1;j>i;j--) { if(a[j]<=a[j-1]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; } } } } //算法2:选择排序,时间复杂度O(n^2) //基本思想:每次选出一最小的数放在前面,依次类推 void SelectSort(int *a,int c) { int key,temp; for(int i=0;i<c-1;i++) { key=i; for(int j=i+1;j<c;j++) { if(a[key]>a[j]) key=j; } temp=a[i]; a[i]=a[key]; a[key]=temp; } } //算法3:插入排序,时间复杂度O(n^2) //基本思想:假设该数组前n-1个是排好的,将第n个插入已排好的队列中 void InsertSort(int *a,int c) { int temp,j; for(int i=1;i<c;i++) { temp=a[i]; j=i-1; while((j>=0) && a[j]>temp) { a[j+1]=a[j]; a[j]=temp; j--; } } } //算法4:希尔排序 //基本思想:插入排序的改进,按增量d分组插入排序,最后一个增量为1 void ShellSort(int *a,int c) { int temp; for(int increce=c/2;increce>0;increce/=2) { for(int i=increce;i<c;i++)//前increce个数不动,后面的数进行插入排序 { for(int j=i-increce;j>=0 && a[j+increce]<a[j]; j-=increce) { temp=a[j]; a[j]=a[j+increce]; a[j+increce]=temp; } } } } //算法5:快速排序 //基本思想:先取一个数作为基准,比他大的放在右边,比他小的放在左边,然后递归查询; void QuickSort(int *a,int left,int right) { if(left>=right) return ; int i=left,j=right; int key=a[left]; while(i<j) { while(i<j && key<=a[j]) j--;//后退一个,继续查找 a[i]=a[j]; while(i<j && key>=a[i]) i++;//前进一个,继续查找 a[j]=a[i]; } a[i]=key; QuickSort(a,left,i-1); QuickSort(a,i+1,right); } //算法6:堆排序 //基本思想:先构建大顶堆,将根结点和最后一个元素交换,一直循环到根节点 void HeapAdjust(int *a,int p,int c) { int temp=a[p];//先将父节点保存在中间变量中 for(int i=p*2+1;i<c;i*=2+1) { if(i<c-1 && a[i]<a[i+1]) i++;//i为两个子节点中的最大值 if(a[p]>=a[i]) break;//自己点比父节点都小则退出循环 a[p]=a[i]; p=i; a[p]=temp; } } void HeapSort(int *a,int c) { int temp; //构建大顶堆,i初始值为c/2-1是因为二叉树的性质可得起父节点个数 for(int i=c/2-1;i>=0;i--) HeapAdjust(a,i,c); for(i=c-1;i>0;i--) { //取出根节点放在最后 temp=a[i]; a[i]=a[0]; a[0]=temp; //再次构建大顶堆 HeapAdjust(a,0,i); } } //算法7:归并排序 //基本思想:先分割,排序后归并 void Merge(int *a,int *b,int start,int middle,int end) { int i=start,m=middle; int j=middle+1,n=end; int k=0;//记录b中个数 while(i<=m && j<=n) { if(a[i]>a[j]) b[k++]=a[j++]; else b[k++]=a[i++]; } while(i<=m) b[k++]=a[i++]; while(j<=n) b[k++]=a[j++]; for(i=start,k=0;i<=end;i++) a[i]=b[k++]; } void MergeSort(int *a,int *b,int start,int end) { int middle=(start+end)/2;//分割点 if(start<end) { //分割 MergeSort(a,b,start,middle); MergeSort(a,b,middle+1,end); //归并排序 Merge(a,b,start,middle,end); } } int main() { int a[9]={50,10,90,30,70,40,80,60,20}; int b[9]; int c=9; //BubbleSort(a,c); //SelectSort(a,c); //InsertSort(a,c); //ShellSort(a,c); //QuickSort(a,0,c); //HeapSort(a,c); MergeSort(a,b,0,c-1); for(int i=0;i<c;i++) { printf("%d\n",a[i]); } return 0; }
相关文章推荐
- google面试题,男孩男女比例?
- Light OJ 1030 - Discovering Gold
- GCT考试总结
- rsync + inotify 实现文件目录的实时单向同步
- php利用curl获取远程图片实现方法
- tkinter Label标签相关
- 2015年10月22日作业-中项-yuansy
- 中点画线算法(计算机图形学)
- html模板与json数据交互
- Claim 2
- 【Android学习笔记】 菜单Menu
- 简单齐全的webview与H5 交互 多中自定义进度条
- 8.3.5 Multiple-Column Indexes 多列索引:
- JVM通过代理服务器连接网络的参数设置
- 保险业务知识
- Oracle——数据类型
- Spring对Hibernate事务管理
- VIM Taglist + ctags
- 求一个整数的二进制中1的个数(转)
- UIApplicationDidEnterBackgroundNotification