常见排序算法汇总(C/C++实现)
来源:互联网 发布:彩虹岛封魔武器 20淘宝 编辑:程序博客网 时间:2024/06/10 22:20
常见排序算法汇总(C/C++实现)(转)
声明:本博客系转载,欲查看原博文,请点击这里。
选择排序(select)
选择排序比较容易理解,每一次往后遍历都是为了寻找“最小值”的下标。N次遍历,时间复杂度为:O(n^2)。冒泡排序(bubble)
冒泡排序也比较形象,理解为大气泡不断下沉,小气泡往上冒。同样往后进行n次遍历,时间复杂度为:O(n^2)。跟选择排序的区别:选择排序属于稳定排序,从初始状态到排序完成过程中的每一次遍历各元素前后位置“相对稳定”。而且,冒泡排序每一轮遍历可能产生多次交换swap(),而选择排序固定每一轮的遍历都只进行一次交换swap()操作。插入排序(insert)
插入排序可以理解为对扑克牌排序,原先拿到一手杂乱的牌,通过“插入”将所有牌排好序。
一般的插入排序时间复杂度同样是:O(n^2),进行具体样例测试时跟样例数据的初始顺序有关。希尔排序(shell)
希尔排序为进化版的插入排序,只因为其基于插入排序的思想上,加入步长”step”。一般读者可能不知道希尔排序应用到大量数据的排序的高效,据研究的学者表明一般情况下希尔排序的排序时间复杂度降低为O(n^(3/2))。归并排序(merge)
归并排序是基于递归的思想进行的一种时间复杂度为:O(N*lgN)排序算法,不过其附加O(n)的空间辅助代价。理解好归并排序后可以将其递归思想扩展应用到数列逆序数的求解问题上,这里不再展开。快速排序(quick)
快速排序有多种实现方式,同样是利用递归的思想,不断将问题划分为具有相同性质的子问题进行求解。实现快速排序算法的平均时间复杂度为:O(N*lgN);快排的O(N*lgN)算法同样通过拓展可以用于求无序数列的“第K大”元素。堆排序(heap)
二叉堆,简称堆(heap)。一种非常奇妙的数据结构,是本人接触过的算法当中最惊叹的算法之一,仅仅利用数组就可以实现。在堆排序中,我们一般采用大根堆,时间复杂度O(N*lgN),排序效果较快排稳定,而且也不需要额外的空间存储代价。
代码
代码块语法遵循标准markdown代码,例如:
/* *排序算法汇总(C/C++实现) */#include <cstdio>#include <cstring>//#define swap(x,y){x^=y;y^=x;x^=y;}#define swap(x,y){int temp=x;x=y;y=temp;}const int N = 10;void selectSort(int *a,int n){ for(int i=0;i<n;i++){ int min=i; for(int j=i+1;j<n;j++){ if(a[j]<a[min]) min=j; } swap(a[i],a[min]); }}//something error!void bubbleSort(int *a,int n){ for(int i=0;i<n;i++){ for(int j=i;j<n;j++) if(a[j]<a[i]) swap(a[i],a[j]); }}void insertSort(int *a,int n){ for(int i=1;i<n;i++){ for(int j=i;j-1>=0&&a[j]<a[j-1];j--){ swap(a[j],a[j-1]); } }}void shellSort(int *a,int n){ //设定划分步长step int step=3; int h=1; while(h*step<n) h=h*step + 1; while(h>=1){ for(int i=1;i<n;i++){ for(int j=i;j-h>=0&&a[j]<a[j-h];j-=h) swap(a[j],a[j-h]); } h /= step; }}void mergeSort(int *a,int p,int q,int *T){ //[p,q)左闭右开 if(p+1>=q) return; int m = p+(q-p)/2; //printf("m=%d\n",m); mergeSort(a,p,m,T); mergeSort(a,m,q,T); for(int i=p,x=p,y=m;i<q;){ if( x<m && y<q && a[x]<a[y] || y>=q) T[i++]=a[x++]; else T[i++]=a[y++]; } for(int i=p;i<q;i++) a[i] = T[i];}void qSort(int *a,int p,int q){ if(p>=q) return ; int i=p-1; for(int j=p;j<q;j++) if(a[j]<a[q]){ i=i+1; swap(a[i],a[j]); } i=i+1; swap(a[i],a[q]); qSort(a,p,i-1); qSort(a,i+1,q);}void sink(int *a,int n,int k){ while(2*k<=n){ int j=2*k; if(j<n && a[j]<a[j+1]) j++; //if(a[j]<a[j+1]) j=j+1; if(a[k] > a[j]) break; swap(a[j],a[k]); k = j; }}void heapSort(int *a,int n){ for(int k=n/2;k>=1;k--) sink(a,n,k); for(;n>1;){ swap(a[1],a[n]); n--; sink(a,n,1); }}void pt(int *a,int s,int n){ for(int i=s;i<n;i++) printf("%d ",a[i]); printf("\n");}int main(){ //printf("Hello world!\n"); int a[N]={2,1,-1,123,0,1,21,7,-10,1}; int b[N+1]={-999,2,1,-1,123,0,1,21,7,-10,1}; int T[N]; int c; printf("请选择一种排序算法:\n 1.选择排序\n 2.冒泡排序\n 3.插入排序\n 4.希尔排序\n 5.归并排序\n 6.快速排序\n 7.堆排序\n ----> "); scanf("%d",&c); switch(c){ case 1: selectSort(a,N); break; case 2: bubbleSort(a,N); break; case 3: insertSort(a,N); break; case 4: shellSort(a,N); break; case 5: mergeSort(a,0,N,T); break; case 6: qSort(a,0,N-1); break; case 7: heapSort(b,N); break; default: printf("选择无效!"); return 1; } printf("输出结果:\n"); if(c==7) pt(b,1,N+1); else pt(a,0,N); return 0;}
- 常见排序算法汇总(C/C++实现)
- C语言中常见排序算法汇总
- 常见排序算法-采用Objective-c实现
- 常见排序算法C/C++实现总结
- 常见排序算法-采用Objective-c实现
- 排序算法汇总(C/C++)
- 常见的几种内排序算法以及实现(C语言)
- 常见的几种内排序算法以及实现(C语言)
- 常见的排序算法C语言实现(—)
- 常见排序算法及其C语言实现(二)
- 常用排序算法汇总(C版)
- 常见排序算法的C语言实现之堆排序
- 常见排序算法(C语言版)
- 经典排序算法汇总(C#)
- C语言排序算法汇总
- C语言排序算法汇总
- C语言常见排序算法
- C语言常见排序算法
- C语言恶作剧(2):鼠标乱抖
- 【勤哲应用】用勤哲EXCEL服务器做销售订单人事管理系统
- 【HNOI2007】紧急疏散EVACUATE BFS+二分答案+最大流
- 2017"百度之星"程序设计大赛
- QT5.9编译Oracle12C驱动
- 常见排序算法汇总(C/C++实现)
- 数据结构的简单理解(1)
- 俄罗斯方块
- 关于DataTable排序
- Python学习——物之始
- C++(4)设计与声明
- 关于泰勒展开的细节-《三体》读后感的读后感...
- 内存区域的划分
- POJ3159-Candies-最短路