插入排序类:直接插入排序和希尔排序
来源:互联网 发布:打鱼软件开发多少钱 编辑:程序博客网 时间:2024/04/30 02:52
//myself test 插入排序类 #include<stdio.h>//1.直接插入排序:(调试一次就成功啦!鼓励一下,当然是在自己确认过逻辑没错的情况下)void InsertSort(int a[],int n){int i=0,j=0;for(i=1;i<n;i++){//数组元素个数从1~n.其中0号位置放置哨兵,共n+1个元素,被排序数为n个 if(a[i+1]<a[i]){ a[0]=a[i+1]; //for(j=i;j>0;j--){这一行错了,不应该用for循环,直到最后j为0,这样后移就不对。应该是当大于a[0]的时候就立刻退出,第二次这个错 j=i;//要变动的位置赋值给j while(a[j]>a[0]){ //用到循环先考虑while循环 a[j+1]=a[j]; j--; } a[j+1]=a[0];} }} //2.希尔排序,又增量缩小排序。//希尔排序是不稳定的,如 3 5 10 8 7 2 8 1 20 6/*d=2 分成2组 (3 10 7 8 20) 和(5 8 2 1 6) 第一组的8在第二组的后面 排序后(3 7 8 10 20)和 (1 2 5 6 8) 现在是第一组的8在第二组前面了 这里不稳定 */ //搞半天原来是这个地方没有声明,直接把ShellSort提到前面了,逗 void Shell(int a[],int n,int d){//假设增量已定,其实就是增量已定的直接插入排序 int i=0,j=0; for(i=d+1;i<n;i++){ if(a[i]<a[i-d]){//要非常注意很有可能不注意写成自减1 a[0]=a[i]; j=i-d; while(j>=0 && a[j]>a[0]){ //要注意,为什么这里要检测j>=0,而直接插入排序不要 a[j+d]=a[j];//这个没错 //j--;这里居然一开始写成了j--,事实上这是不对的,应该每次减去d j-=d; }//如果直到最前面一个菜插入,那么这个循环下来,j必定是负的,这一点需要注意 a[j+d]=a[0];}} }void ShellSort(int a[],int n){//这里的d是增量 int d=n/2;while(d>=1){ Shell(a,n,d); d=d/2;} } void print(int a[],int n){ for(int i=1;i<n;i++){ printf("%d\t",a[i]);} printf("\n");}int main(){ int a[9]={0,3,1,5,7,2,4,9,6}; InsertSort(a,8); print(a,8); int b[9]={0,3,1,5,7,2,4,9,6}; ShellSort(b,9); print(b,9); getchar(); return 0;}
0 0
- 插入排序类:直接插入排序和希尔排序
- 插入排序(直接 和 希尔)
- 插入类排序:直接插入和希尔排序
- 插入排序-直接插入排序 希尔排序
- 直接插入排序和希尔排序
- java直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 【直接插入排序】和【希尔排序】
- 直接插入排序和希尔排序
- 数据结构排序--直接插入和希尔排序
- 插入排序:直接插入排序和希尔排序
- 关于插入排序 直接插入排序和希尔排序
- 插入排序--直接插入排序和希尔排序
- 小女生的头发
- ubuntu14.04 下的tftp服务器搭建
- Win7 64位系统下 Retional rose 2003 安装及破解
- poj3481 Double Queue splay
- 【C#基础】【语法03】课后作业题 01-06
- 插入排序类:直接插入排序和希尔排序
- ubuntu12.04下samba、tftp、nfs的配置
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 队列初步
- ReactOS分析windows DPC机制(1)
- [2463]学密码学一定得学程序 (KMP)SDUT
- BZOJ 3630 JLOI 2013 镜面通道 最小点割集
- 黑马程序员 oc
- 阿里巴巴2015年校招笔试附加题