1.归并排序

分析:

归并排序使用分治思想,原理是

①将一个无序数列分成两个序列后,对序列进行排序后,再将两个有序序列合并成一个有序序列;

②分开的两个序列又可以进行再分排序然后合并从而形成问题的子问题。

#include <stdio.h>
#include <stdlib.h>void merge(int *a, int *ans, int s, int m, int t){int ak, bk, ansk;ak = s, bk = m+1, ansk = s;while(ak<=m&&bk<=t){*(ans+ansk++) = (*(a+ak)<*(a+bk))?*(a+ak++):*(a+bk++);}for(; ak<=m; ak++){*(ans+ansk++) = *(a+ak);}for(; bk<=t; bk++){*(ans+ansk++) = *(a+bk);}
}void mergesort(int *a, int n, int low, int high, int *ans){int mid;int *temp;temp = (int*)malloc(sizeof(int)*n);  //save the result of sortif(low==high){*(ans+low) = *(a+low);return;}mid = (low+high)/2;//sort a[low...mid]mergesort(a, n, low, mid, temp);//sort a[mid+1, high]mergesort(a, n, mid+1, high, temp);//merge temp[low...mid] temp[mid+1, high] into ans[low...high]merge(temp, ans, low, mid, high);free(temp);
}int main(void){int data[] = {2,4,8,5,1,6,3,10,9};int n = sizeof(data)/sizeof(int);int ansk;int *ans = (int*)malloc(sizeof(int)*n);int *temp = (int*)malloc(sizeof(int)*n);mergesort(data, n, 0, n-1, ans);for(ansk=0; ansk<n; ansk++){printf("%d ", *(ans+ansk));}printf("\n");return 0;
}

2.堆排序

分析:

①将无序数列视为一棵完全二叉树的节点,并以层逐个加入树中,树的节点数/2的节点必有孩子;

②堆排序(结果需要从小到大排序)旨在将最大值元素移至树根处,并将其与树最后节点交换即可;

③对于一个结点,需要满足一个条件a[i]>a[2*i]和a[i]>a[2*i+1];

④当一个结点与其孩子交换后,需要对交换的孩子向下调整,保证满足条件③;

所以堆排序的步骤则为:

1)由无序数组视为一棵无安全二叉树的节点,从拥有孩子的节点开始,先对该树进行调整,使其满足条件③,此时形成大顶堆;

2)树根结点与树最后节点交换后,由于已经形成大顶堆,所以第二大的元素必为根结点的孩子,所以只需要进行向下调整即可将最大元素置于根结点位置;假设第二大元素不为根结点孩子,那么必然位于根结点孩子的左或右子树,而由于第三个条件,子树的根结点必为最大,所以必定不满足条件③。

#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;
}void heapadjust(int *data, int n, int i){//downward adjustmentint k;int max;for(k=i+1; k<=n/2; k++){//compare root,lchild,rchildmax = (*(data+k-1)>*(data+2*k-1))?k-1:2*k-1;if(2*k<n)max = (*(data+max)>*(data+2*k))?max:2*k;if(max==k-1)continue;else{swap(data+k-1, data+max);heapadjust(data, n, max);}}
}
void heapsort(int n, int *data){int k;for(k=0; k<n; k++){swap(data, data+n-k-1);heapadjust(data, n-k-1, 0);}
}int main(void){int data[]={5,4,3,2,1};int k;int n=sizeof(data)/sizeof(int);for(k=n/2; k>=0; k--)heapadjust(data, n, 0);  //initialize heapheapsort(n, data);for(k=0; k<n; k++){printf("%d ", *(data+k));}printf("\n");return 0;
}

3.快速排序

分析:

①寻找位置s,将无序数列第一个元素放置于as,使得as>aj (t<j<s),as<ai (n>i>s);

②对无序数列at,...,as-1和as+1,...,an重复步骤①即可,知道t=s-1或s+1=n位置。

#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;
}int find_mid(int *d, int low, int high){int k;while(low<high){while(*(d+low)<*(d+high)&&low<high)high--;swap(d+low, d+high);while(*(d+low)<*(d+high)&&low<high)low++;swap(d+low, d+high);}return low;
}void quicksort(int *d, int low, int high){int mid;if(low<high){mid = find_mid(d, low, high);quicksort(d, low, mid-1);quicksort(d, mid+1, high);}
}int main(void){int data[] = {5,9,7,8,2,4,6,3,1};int n = sizeof(data)/sizeof(int);int k;quicksort(data, 0, n-1);for(k=0; k<n; k++)printf("%d ", *(data+k));printf("\n");return 0;
}

转载于:https://www.cnblogs.com/xhyzjiji/p/6159359.html

【排序】内部排序算法实现相关推荐

  1. 10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章  内部排序 - 堆排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  2. 10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第10章  内部排序 - 顺序表地址排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版) ...

  3. 10-10-归并排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章  内部排序 - 归并排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源 ...

  4. 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章  内部排序 - 基数排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源 ...

  5. 数据结构-考研难点代码突破(C/C++/Java排序算法,性能及其稳定性分析(内部排序))

    文章目录 1. 内部排序的基本种类 2. 插入排序 Ⅰ直接插入排序 性能与稳定性分析 Ⅱ 折半插入排序 性能与稳定性分析 Ⅲ 希尔排序 性能与稳定性分析 3. 交换排序 Ⅰ 冒泡排序 性能与稳定性分析 ...

  6. 【数据结构(C语言)】数据结构-内部排序

    内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...

  7. 超详细!各种内部排序算法的比较

    先来个表格总结直观展示下: 各种内部排序算法的性质            算法种类                    时间复杂度  空间复 杂度 稳定性 最好情况 平均情况 最坏情况 插入排序 直 ...

  8. 万字长文总结八大经典内部排序算法

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  9. 飞鸽传书内部排序算法的性能比较

    部排序算法的性能比较 飞鸽传书内部排序算法的性能比较 1)排序的稳定性及分析: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=r ...

  10. 数据结构之排序算法:内部排序算法的应用与比较

    排序算法:内部排序算法的应用与比较 思维导图: 比较: 应用: 思维导图: 比较: 应用:

最新文章

  1. Linux 基础学习
  2. 想学Python?那这套教程再适合你不过了!!
  3. SAP QM 检验批里样品数量的确定
  4. 陈勋教授的脑电信号降噪视频与讲座总结
  5. OCR的备份与恢复方法
  6. android 同根动画_android 动画系列 (1) - tween 动画(view动画)
  7. 【CSS+HTML】关于字体的说明
  8. cshop是什么开发语言_mes用什么语言开发?mes开发平台
  9. Linux dstat 监控工具
  10. 功率计量芯片HLW8012介绍与应用
  11. 简单博饼游戏的实现(java)
  12. 渗透测试技术----工具使用(二)--Nessus工具下载及使用(安装在Kali上)
  13. 虚拟机打不开磁盘或它所依赖的某个快照磁盘
  14. 力扣438题找到字符串中所有字母异位词
  15. 26thCSIG云上微表情:基于面部动作单元(AU)的微表情分析
  16. 西瓜微数独家解析: 干货管饱|帮你省XXX万广告费的KOL投放指南
  17. 推荐系统论文源码笔记——依次学习之DKN源码笔记
  18. Entity Framework 6 Recipes 2nd Edition(9-7)译-在WCF服务中序列化代理
  19. java h264 sps解码,H.264(H264)解码SPS获取分辨率和帧率
  20. V-Rep虚拟机器人实验平台在Ubuntu18.04LTS安装与使用笔记

热门文章

  1. linux界面如何进行文档排序,Linux中使用sort对文档中的内容进行排序
  2. idea maven丢失
  3. Hive 排序入门--order by与sort by
  4. Hive 存储格式入门
  5. JavaScript设计模式与开发实践 - 单例模式
  6. jquery的validate的用法
  7. python属性查找 深入理解(attribute lookup)
  8. MRTG 监控主机流量
  9. 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
  10. python语法_元组