排序算法汇总一------插入类算法
来源:互联网 发布:sql多张表合并 union 编辑:程序博客网 时间:2024/05/19 02:39
插入排序的基本思想:
在一个已经排好顺序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排序记录全部插入为止。
直接插入算法:
思路:将第i个数直接插入到前面i-1个已经排好序的记录中,平均复杂度:o(n*n)
void InsSort(int *d,int length){ for(int i=1;i<length;i++) { int next=i-1; int nowdata=d[i]; while(nowdata>d[next]&&next>=0) { d[next+1]=d[next];next--; } d[next+1]=nowdata; }}
折半插入算法:
思路:与直接插入比,该算法利用折半查找,性能优于直接插入,平均复杂度:o(n*n)
void BinSort(int *d,int length){ for(int i=1;i<length;i++) { int nowdata=d[i]; int low=0,high=i-1; while(low<=high) { int mid=(low+high)/2; if(d[mid]>nowdata) { low=mid+1; } else { high=mid-1; } } for(int j=i-1;j>=low;j--) d[j+1]=d[j]; d[low]=nowdata; }}
希尔排序算法:
思路:又称为缩小增量排序法。是一种基于插入思想的排序算法,算法本身利用插入算法的最佳性质,分成若干个较小的子序列,对子序列进行排序。增量的选择采用[d/3]+1
void ShellSort(int *d,int length){ bool finish=false; int dlt=length; while(!finish) { dlt=dlt/3+1; if(dlt==1) finish=true; for(int i=dlt;i<length;i++) { int nowdata=d[i]; if(nowdata>d[i-dlt]) { int j; for(j=i-dlt;j>=0 && nowdata>d[j];j-=dlt){d[j+dlt]=d[j];} d[j+dlt]=nowdata; } } } Print(d,length);}
总测试代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int data[10]={0,5,6,9,8,7,5,3,5,1};//test datavoid Print(int *d,int length){ for(int i=0;i<length;i++) { printf("%d ",d[i]); } printf("\n\n\n");}void InsSort(int *d,int length){ for(int i=1;i<length;i++) { int next=i-1; int nowdata=d[i]; while(nowdata>d[next]&&next>=0) { d[next+1]=d[next];next--; } d[next+1]=nowdata; } Print(d,length);}void BinSort(int *d,int length){ for(int i=1;i<length;i++) { int nowdata=d[i]; int low=0,high=i-1; while(low<=high) { int mid=(low+high)/2; if(d[mid]>nowdata) { low=mid+1; } else { high=mid-1; } } for(int j=i-1;j>=low;j--) d[j+1]=d[j]; d[low]=nowdata; } Print(d,length);}void ShellSort(int *d,int length){ bool finish=false; int dlt=length; while(!finish) { dlt=dlt/3+1; if(dlt==1) finish=true; for(int i=dlt;i<length;i++) { int nowdata=d[i]; if(nowdata>d[i-dlt]) { int j; for(j=i-dlt;j>=0 && nowdata>d[j];j-=dlt){d[j+dlt]=d[j];} d[j+dlt]=nowdata; } } } Print(d,length);}int main(){ ShellSort(data,10); return 0;}
没写完,待续
0 0
- 排序算法汇总一------插入类算法
- 算法一:插入排序
- 排序算法(一):插入排序
- 排序算法一:插入排序
- 算法学习(一)-插入排序
- 排序算法(一):直接插入排序
- 直接插入排序法---排序算法(一)
- 排序算法(一):插入排序
- 排序算法(一)插入排序
- [每日一算法]排序之插入排序
- 排序算法(一) -- 插入排序
- 排序算法一:直接插入排序
- 排序算法(一):直接插入排序
- Java常用排序算法(一):插入排序
- 排序算法一:简单插入排序
- 八大排序算法图解一----插入排序
- 排序算法一:直接插入排序
- 算法学习(排序一)插入排序
- HTML入门
- find命令
- LeetCode
- HDU - 3695 Computer Virus on Planet Pandora AC自动机+优化
- CCF201604-1 折点计数(解法二)(100分)
- 排序算法汇总一------插入类算法
- 文章标题
- 对于特殊的边界值特殊考虑的问题
- java 多线程总结
- VIM的使用
- Android学习笔记--多渠道打包
- 将有序数组转变成平衡二叉查找树
- 最短路和次短路条数
- 一名信竞选手的第二个家