第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课 - 进阶星移相关推荐

  1. 三维电子沙盘虚拟数字沙盘开发教程第28课

    三维电子沙盘虚拟数字沙盘开发教程第28课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chinamtouch.com ...

  2. 数据营销“教父”宋星十年倾心之作,让数据真正赋能企业

    你是否对"数据"二字有莫名的喜好? 应用数据,似乎总是能够带来很多神奇的改变,把那些隐秘的角落里面藏着的东西展现出来,颠覆人们的认知,或是如同魔法,让一个眼看就要行将就木的事情重新 ...

  3. 刚刚!国产大数据基础软件第一股星环科技成功上市,开盘大涨超52%

    作者 | 冬梅 10 月 18 日,"国产大数据基础软件第一股"星环信息科技(上海)股份有限公司(简称"星环科技")正式登陆科创板,股票代号为星环科技(6880 ...

  4. 【观察】大数据3.0新时代 星环科技的思与行

    申耀的科技观察 读懂科技,赢取未来! 众所周知,如今的世界正在以加速度进入到智慧时代,特别是随着各项业务的云化深入以及万物互联,数据处理能力的进一步提升,智能算法一次又一次的突破,以及云计算在传统产业 ...

  5. 当且仅当函数依赖a→b在r上成立_数据库第06章关系数据理习题课.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp数据结构与算法 数据库第06章关系数据理习题课.ppt36页 本 ...

  6. 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解

    第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解 本文根据家林大神系列课程编写 http://weibo.com/ilovepains 为什么讲解Sorte ...

  7. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

    知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...

  8. 中海达RTK(星移查分)使用指南

    中海达RTK(星移查分)使用指南 1.基站和手簿开机,基站发出"锁定了"声音 2.打开Hi-Survey Road软件,选择设备-设备连接-连接-选择13681745(蓝牙连接), ...

  9. 大数据入门第一课 Hadoop基础知识与电商网站日志数据分析

    大数据入门第一课 Hadoop基础知识与电商网站日志数据分析 本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS.YARN.MapRedu ...

  10. 视频教程-大数据分析师实战课-大数据

    大数据分析师实战课 任老师,Cloudera管理/开发/分析认证讲师,华为高级特聘讲师,新华三大学高级特聘讲师,中国大数据技术与应用联盟高级讲师,全国高校大数据联盟特聘讲师,中国移动高级讲师,前IBM ...

最新文章

  1. 谈谈@@IDENTITY 和 SCOPE_IDENTITY()的区别
  2. Mac 技术篇-设置Finder文件管理显示文件路径
  3. 转载:linux安装rlwrap软件包
  4. Angular ActivatedRouteSnapshot
  5. 我是新人我最强----团队新手培训计划展开
  6. JAVA构架之并发编程的一些总结
  7. python多线程知识点(只能说是知道有多线程一个词而已,摸摸头顶,还有毛)
  8. 面试怪事:网上抄答案的程序员
  9. 单片机IC卡读取开题报告_基于单片机实现IC卡读卡器
  10. 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]
  11. access转换MySQL教程,如何将Access数据库转换为SQL Server
  12. excel转置怎么操作_直接理解转置卷积(Transposed convolution)的各种情况 - 颀周
  13. [ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数
  14. HR终极一问:为啥选择前端?答:混口饭吃。卒。(附网易面经)
  15. 利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付
  16. makefile和make
  17. 上海科技大学计算机学院院长,王浩宇(上海科技大学常任副教授)_百度百科...
  18. 医学计算机基础ppt,医学计算机应用第一章计算机基础知识ppt课件.ppt
  19. 根据某天或某月是否是节假休息日
  20. 记录:调用山东天地图的时候跨域解决方案

热门文章

  1. 灵修---士师记第9章
  2. ServletContextListener的用法
  3. 藏不住了,Flink 未来发展的最新方向在这里!
  4. SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析
  5. 2019年9月全国程序员工资统计,你处于什么位置?
  6. Android View框架总结(二)View焦点
  7. 软硬件联合调试步骤_PLC与SCADA或第三方软件的联合仿真调试—NetToPLCSIM
  8. linux中ifi_info的英文全称,【DNS服务器IP地址-域名注册查询-CDN加速技术】
  9. python单链表实现荷兰国旗问题_[算法题] 荷兰国旗问题
  10. mysql 日期格式化_每天一个常用MySQL函数-from_unixtime等