希尔堆快排
1、希尔排序
(1)、算法思想:希尔排序是插入排序的改良算法,增加了一个步长step,每次插入排序使步长为step的元素形成一个递增序列,然后缩小增量,继续插入,直至step=1时,就是插入排序了,此时排序完成;
算法模型:
(2)、代码实现
#include<stdio.h> void insertSort(int *a, int count, int step); void showArray(int *a, int count); void shellSort(int *a, int count); void shellSort(int *a, int count){ int step; for(step = count/2; step > 0; step /= 2){ insertSort(a, count, step); } } void showArray(int *a, int count){ int i; for(i = 0; i < count; i++){ printf("%d ", a[i]); } printf("\n"); } //以下就是插入排序了,思想完全一样,只不过步长为step而已!!! void insertSort(int *a, int count, int step){ int i; int j; int n; int tmp; for(i = step; i < count; i+=step){ tmp = a[i]; for(j = 0; a[i]>a[j] && j<i; j+=step){ ; } if(i != j){ for(n = i; n > j; n-=step){ a[n] = a[n-step]; } a[j] = tmp; } } } void main(void){ int a[] = {2, 7, 1, 11, 0, 9, 8, 10}; int count = sizeof(a)/sizeof(int); printf("排序前输出如下: "); showArray(a, count); shellSort(a, count); printf("排序后输出如下: "); showArray(a, count); }
(3)、结果截图
(4)、算法分析
时间复杂度为:O(nlogn);
2、堆排
(1)、算法思想:对无序数组先构建小堆(完全二叉树结构),每次删除堆顶元素(用最后一个元素直接覆盖第一个元素),每次输出堆顶元素就行;
小堆:根(父)结点比左右孩子都小的数字;
(2)、代码实现
#include<stdio.h> void heapSort(int *a, int count); void siftDown(int *a, int count, int start); void swap(int *a, int *b); int removeHeap(int *a, int n); int removeHeap(int *a, int n){ int key = a[0]; a[0] = a[n]; siftDown(a, n, 0); return key; } void swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; } void siftDown(int *a, int count, int start){ int i = start; int j = 2*i+1; while(j < count){ //说明有左子树 if(j < count-1 && a[j] > a[j+1]){ //表示存在右孩子的情况下; j++; //j:表示指向左右子树中最小的一个 } if(a[i] <= a[j]){ break; //不用调整,父节点的值是最小的; }else{ swap(&a[i], &a[j]); //交换 i = j; //一直往树下交换,一直调整到叶子结点 j = 2*i+1; } } } void heapSort(int *a, int count){ int curPos = count/2-1; //最后一个非叶子结点 int i; int key; while(curPos >= 0){ siftDown(a, count, curPos); curPos--; } /* 输出构建好的堆结构 for(i = 0; i < count; i++){ printf("%d ", a[i]); } printf("\n"); */ for(i = 0; i < count; i++){ key = removeHeap(a, count-i-1); //传参:第二个参数是下标 printf("%d ", key); } printf("\n"); } void main(void){ int a[] = {3, 5, 7, 1, 4, 2, 9, 10}; int count = sizeof(a)/sizeof(int); heapSort(a, count); }
(3)、结果截图
(4)、算法分析
时间复杂度:O(nlogn);
3、快速排序
(1)、算法思想:分治的思想,一轮下来将第一个数放到了数字大小的中间,经过多次递归完成排序算法;
(2)、代码实现
#include<stdio.h> int oneQuickSort(int *a, int i, int j); void quickSort(int *a, int i, int j); void showArray(int *a, int count); void showArray(int *a, int count){ int i; for(i = 0; i < count; i++){ printf("%d ", a[i]); } printf("\n"); } void quickSort(int *a, int i, int j){ int index; if(i < j){ index = oneQuickSort(a, i, j); quickSort(a, i, index-1); quickSort(a, index+1, j); } } int oneQuickSort(int *a, int i, int j){ int tmp; tmp = a[i]; while(i < j){ while(i < j && a[j] > tmp){ j--; } if(i < j){ a[i++] = a[j]; } while(i < j && a[i] < tmp){ i++; } if(i < j){ a[j--] = a[i]; } } a[i] = tmp; return i; } void main(void){ int a[] = {3, 7, 1, 0, 9, -9,}; int count = sizeof(a)/sizeof(int); quickSort(a, 0, count-1); showArray(a, count); }
(3)、结果截图
(4)、解法二代码实现
#include<stdio.h> int quickSortOne(int *a, int count){ int i = 0; int j; int tmp; if(a[0] > a[1]){ tmp = a[0]; a[0] = a[1]; a[1] = tmp; } for(j = 2; j < count; j++){ if(a[j] < a[0]){ tmp = a[j]; a[j] = a[++i]; a[i] = tmp; } } tmp = a[0]; a[0] = a[i]; a[i] = tmp; return i; } void quickSort(int *a, int count){ int index = 0; if(index < count-1){ index = quickSortOne(a, count); quickSort(a, index+1); quickSort(a+index+1, count-index-1); } } void showArray(int *a, int count){ int i; for(i = 0; i < count; i++){ printf("%d ", a[i]); } printf("\n"); } int main(void){ int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int count = sizeof(a)/sizeof(int); int index; quickSort(a, count); showArray(a, count); return 0; }
(5)、算法分析
时间复杂度:O(nlogn);
最坏情况:已经排好序或完全逆序,此时时间复杂度:O(n^2);

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SharePoint 升级 Web Site 模式
大家在日常的SharePoint运维中或者升级中,经常会遇到需要升级站点模式。其实我遇到这个问题的时候,就是从SP13升级到SP16时碰见的,所以今天分享给大家。 首先我们要知道一点,在SharePoint 2016的产品设计中,SharePoint Server 2016 不支持 SharePoint 2010 模式(即兼容性级别 14)的网站集。处于此模式的任何网站集将阻止将该内容数据库连接到 SharePoint Server 2016 服务器场。 也就是说我们必须在现有 2013 服务器场上将所有 SharePoint 2010 模式的网站升级到 2013 模式(即兼容性级别 15),然后在新的 SharePoint 2016 服务器场上安装数据库。 好,下面我们来说说怎么升级。 首先,我们要看一看哪些web site目前仍然使用的是SP2010模式,我们在 SP13 服务器上打开 SharePoint Power Shell 输入以下命令 Get-SPSite -Limit All | ? { $_.CompatibilityLevel -eq 14 } 如上图,该命令可以...
- 下一篇
Hyper-V 性能加速之NUMA
SMP和NUMA 根据 CPU 访问内存中地址所需时间和距离我们可以将CPU和内存结构分为SMP(SMP,Symmetric Multi-Processor,也称之为一致内存访问UMA)、NUMA和MPP(Massive Parallel Processing)三种结构。而我们在虚拟化环境中常用的结构包括SMP和NUMA这两种。相对SMP(UMA)来说,NUMA具有更加好的扩展性。NUMA将CPU和相近的内存配对组成节点,在每个NUMA节点里,CPU都有本地内存,访问距离短,性能好。NUMA比SMP具有更好的扩展性,SMP使用共享内存控制器,所有的CPU使用共享内存总线访问内存,如图1所示。在CPU不多的时候,SMP可以很好地工作,但是一旦CPU的数量很大的时候,这些 CPU 既可能造成内存总线的压力,也可能发生CPU之间相互“争夺”对共享内存总线的访问。NUMA采用分组的形式,限制一个NUMA节点里面的CPU数量和内存大小,并使用缓存一致性内部连接总线将各个NUMA节点连接起来,如图2所示。在服务器CPU日益增多和虚拟化普及的时代,NUMA更能适应高密度虚拟化环境的要求。 图1 SM...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群