数据--第28课 - 进阶星移
第28课 - 进阶星移
1. 希尔排列
将待排序列划分为若干个组,在每一个组内进行插入排序,一整个序列基本有序,后再对整个序列进行插入排列。
例如:将n个数据元素分成d个子序。
{ R[1],R[1+d],R[1+2d],…,R[1+kd] }。
{ R[2],R[2+d],R[2+2d],…,R[2+kd] }。
...
{ R[d],R[2d],R[3d],…,R[kd],R[(k+1)d] }。
其中,d 称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1。
程序:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void ShellSort(int array[], int len) // O(n*n)
{
int i = 0;
int j = 0;
int k = -1;
int temp = -1;
int gap = len;
do
{
gap = gap / 3 + 1;
for(i=gap; i<len; i+=gap)
{
k = i;
temp = array[k];
for(j=i-gap; (j>=0) && (array[j]>temp); j-=gap)
{
array[j+gap] = array[j];
k = j;
}
array[k] = temp;
}
}while( gap > 1 );
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
ShellSort(array, len);
println(array, len);
return 0;
}
2. 快速排序
(1)任取待排序序列中的某个数据元素(例如:第一个元素)作为基准,按照该元素的关键字大小整个序列划分为左右两个子序列:
l 左侧子序列中所有元素都小于或等于基准元素。
l 右侧子序列中所有元素都大于基准元素。
l 基准元素排在这两个子序列中间。
(2)分别对这两个子序列重复实施上述方法,直到所有的对象都排在相应的位置上为止。
首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。
例题:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
int partition(int array[], int low, int high)
{
int pv = array[low];
while( low < high )
{
while( (low < high) && (array[high] >= pv) )
{
high--;
}
swap(array, low, high);
while( (low < high) && (array[low] <= pv) )
{
low++;
}
swap(array, low, high);
}
return low;
}
void QSort(int array[], int low, int high)
{
if( low < high )
{
int pivot = partition(array, low, high);
QSort(array, low, pivot-1);
QSort(array, pivot+1, high);
}
}
void QuickSort(int array[], int len) // O(n*logn)
{
QSort(array, 0, len-1);
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
QuickSort(array, len);
println(array, len);
return 0;
}
上面的两种排列方式,虽然都很快,但是还是不稳定的,为了运算的稳定性,我们下面介绍归并排序。
3. 归并排序
(1) 将两个或两个以上的有序序列合并成一个新的有序数列:
(2) 有序序列V[1] …V[m]和V[m+1] …V[n],变成V[1] …V[n],这种归并方法称为2路归并。
(3) 将3个有序序列归并为一个新的有序列归并为一个新的有序列,称3路归并。
检测两个有序序列A和和B,C为归并后的新的有序序列:
当i和j都在两个序列内变化时,根据关键码的大小将较小的数据元素排放到新序列k所指位置中。
当i与j中有一个已经超出序列时,将另一个序列中的剩余部分照抄到新序列中。
例子:
#include <stdio.h>
#include <malloc.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void Merge(int src[], int des[], int low, int mid, int high)
{
int i = low;
int j = mid + 1;
int k = low;
while( (i <= mid) && (j <= high) )
{
if( src[i] < src[j] )
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while( i <= mid )
{
des[k++] = src[i++];
}
//这里的程序等价于
//des[k] = src[i];
//k++; i++;
while( j <= high )
{
des[k++] = src[j++];
}
}
void MSort(int src[], int des[], int low, int high, int max)
{
if( low == high )
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
int* space = (int*)malloc(sizeof(int) * max);
if( space != NULL )
{
MSort(src, space, low, mid, max);
MSort(src, space, mid+1, high, max);
Merge(space, des, low, mid, high);
}
free(space);
}
}
void MergeSort(int array[], int len) // O(n*logn)
{
MSort(array, array, 0, len-1, len);
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
MergeSort(array, len);
println(array, len);
return 0;
}
小结:
(1) 希尔排序,快速排序和归并排序将排序算法的时间复杂度提高到了O(n*logn)。
(2) 希尔排序和快速排序的排序结果是不稳定的。
(3) 归并排序的排序结果是稳定的。
转载于:https://www.cnblogs.com/free-1122/p/11336013.html
数据--第28课 - 进阶星移相关推荐
- 三维电子沙盘虚拟数字沙盘开发教程第28课
三维电子沙盘虚拟数字沙盘开发教程第28课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chinamtouch.com ...
- 数据营销“教父”宋星十年倾心之作,让数据真正赋能企业
你是否对"数据"二字有莫名的喜好? 应用数据,似乎总是能够带来很多神奇的改变,把那些隐秘的角落里面藏着的东西展现出来,颠覆人们的认知,或是如同魔法,让一个眼看就要行将就木的事情重新 ...
- 刚刚!国产大数据基础软件第一股星环科技成功上市,开盘大涨超52%
作者 | 冬梅 10 月 18 日,"国产大数据基础软件第一股"星环信息科技(上海)股份有限公司(简称"星环科技")正式登陆科创板,股票代号为星环科技(6880 ...
- 【观察】大数据3.0新时代 星环科技的思与行
申耀的科技观察 读懂科技,赢取未来! 众所周知,如今的世界正在以加速度进入到智慧时代,特别是随着各项业务的云化深入以及万物互联,数据处理能力的进一步提升,智能算法一次又一次的突破,以及云计算在传统产业 ...
- 当且仅当函数依赖a→b在r上成立_数据库第06章关系数据理习题课.ppt
您所在位置:网站首页 > 海量文档  > 计算机 > 数据结构与算法 数据库第06章关系数据理习题课.ppt36页 本 ...
- 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解
第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解 本文根据家林大神系列课程编写 http://weibo.com/ilovepains 为什么讲解Sorte ...
- python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验
知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...
- 中海达RTK(星移查分)使用指南
中海达RTK(星移查分)使用指南 1.基站和手簿开机,基站发出"锁定了"声音 2.打开Hi-Survey Road软件,选择设备-设备连接-连接-选择13681745(蓝牙连接), ...
- 大数据入门第一课 Hadoop基础知识与电商网站日志数据分析
大数据入门第一课 Hadoop基础知识与电商网站日志数据分析 本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS.YARN.MapRedu ...
- 视频教程-大数据分析师实战课-大数据
大数据分析师实战课 任老师,Cloudera管理/开发/分析认证讲师,华为高级特聘讲师,新华三大学高级特聘讲师,中国大数据技术与应用联盟高级讲师,全国高校大数据联盟特聘讲师,中国移动高级讲师,前IBM ...
最新文章
- 谈谈@@IDENTITY 和 SCOPE_IDENTITY()的区别
- Mac 技术篇-设置Finder文件管理显示文件路径
- 转载:linux安装rlwrap软件包
- Angular ActivatedRouteSnapshot
- 我是新人我最强----团队新手培训计划展开
- JAVA构架之并发编程的一些总结
- python多线程知识点(只能说是知道有多线程一个词而已,摸摸头顶,还有毛)
- 面试怪事:网上抄答案的程序员
- 单片机IC卡读取开题报告_基于单片机实现IC卡读卡器
- 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]
- access转换MySQL教程,如何将Access数据库转换为SQL Server
- excel转置怎么操作_直接理解转置卷积(Transposed convolution)的各种情况 - 颀周
- [ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数
- HR终极一问:为啥选择前端?答:混口饭吃。卒。(附网易面经)
- 利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付
- makefile和make
- 上海科技大学计算机学院院长,王浩宇(上海科技大学常任副教授)_百度百科...
- 医学计算机基础ppt,医学计算机应用第一章计算机基础知识ppt课件.ppt
- 根据某天或某月是否是节假休息日
- 记录:调用山东天地图的时候跨域解决方案
热门文章
- 灵修---士师记第9章
- ServletContextListener的用法
- 藏不住了,Flink 未来发展的最新方向在这里!
- SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析
- 2019年9月全国程序员工资统计,你处于什么位置?
- Android View框架总结(二)View焦点
- 软硬件联合调试步骤_PLC与SCADA或第三方软件的联合仿真调试—NetToPLCSIM
- linux中ifi_info的英文全称,【DNS服务器IP地址-域名注册查询-CDN加速技术】
- python单链表实现荷兰国旗问题_[算法题] 荷兰国旗问题
- mysql 日期格式化_每天一个常用MySQL函数-from_unixtime等