前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 ># 置换选择排序

# 置换选择排序

作者头像
用户1175783
发布于 2019-09-10 06:37:54
发布于 2019-09-10 06:37:54
67100
代码可运行
举报
运行总次数:0
代码可运行

# 置换选择排序

置换选择排序是对多路平衡归并排序算法的优化,主要优化的是生成多路归并集合的过程。

# 原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 取无序集合的前n个纪录,n的大小右内存工作区的最大容量决定
2. 取n个纪录中的最小值,写入一个新归并集合中
3. 此时工作取中还剩n-1个元素,取无序集合的下一个元素补齐工作区的元素为n个
4. 从n个纪录中选出比该归并段中最大值大的元素集合中的最小值,写入该归并集合,取无序集合的下一位补充工作取
5. 重复34直到n个纪录中找不出满足4条件的纪录
6. 重复2-6,直到所有的无序集合纪录都进入归并集合
7. 此时归并集合已经创建完成,再按照胜者树/败者树的算法排序即可

# 实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inputArr = [199383, 10, 34, -1, -32, -29, 4,
            0, 34, 5, 4, 36, 1, 8, 123, 453, 1008]
print("未排序集合:{0}".format(inputArr))
'''
构建多路集合数据
0: -1 10 34 199383
1: -32 -29 0 4 4 5 8 34 36 123 453 10080
2: 1
'''
length = len(inputArr)
sortArr = [None]*length
groupArr = []
# 工作区大小
count = 4
startIndex = count
groupIndex = 0
# length+count是为了将工作的区的数据也作为无序数组的部分,就想是一个循环数组
# 这样当startIndex>length时也不同单独处理工作区的排序,支持在压缩工作区的大小,直到工作取长度为1时结束排序
while startIndex < length+count:
    if(len(groupArr) == groupIndex):
        groupArr.append([])
    itemArr = groupArr[groupIndex]
    itemLength=len(itemArr)
    # 当startIndex>length时把数组看作循环数组,
    # 所以下一个索引就是startIndex%,
    # 但这就等于压缩了工作空间n的大小,所以工作空间的起始位置就不在为0
    firsrIndex= startIndex%length if(startIndex>length) else 0
    minIndex = firsrIndex
    minmaxIndex=None
    for index in range(firsrIndex, count):
        min = inputArr[minIndex]
        item = inputArr[index]
        # 当索引大于length时item存在None
        if(item==None):
            continue
        if(itemLength==0 and item <= min):
            minIndex = index
        if(itemLength>0 and item>=itemArr[-1]):
            if(minmaxIndex==None):
                minmaxIndex=index
                continue
            minmax=inputArr[minmaxIndex]
            if(item<minmax):
                minmaxIndex = index
    # 如果长度为0则为一个新归并段,设置第一个元素为工作区最小值
    if(len(itemArr) == 0):
        itemArr.append(inputArr[minIndex])
        inputArr[minIndex] = inputArr[startIndex%length]
    elif (minmaxIndex!=None and inputArr[minmaxIndex] >= itemArr[-1]):
        itemArr.append(inputArr[minmaxIndex])
        inputArr[minmaxIndex] = inputArr[startIndex%length]
    else:
        groupIndex += 1
        continue
    inputArr[startIndex%length]=None
    startIndex += 1

sortIndex = 0
while sortIndex < length:
    minGroupIndex = 0
    for groupIndex in range(1, len(groupArr)):
        minItem = groupArr[minGroupIndex][0]
        item = groupArr[groupIndex][0]
        minGroupIndex = minGroupIndex if(minItem < item) else groupIndex
    sortArr[sortIndex] = groupArr[minGroupIndex][0]
    del groupArr[minGroupIndex][0]
    if(len(groupArr[minGroupIndex])==0):
        groupArr.remove(groupArr[minGroupIndex])
    sortIndex += 1
print("已排序集合:{0}".format(sortArr))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
# 多路平衡归并排序(胜者树、败者树)
# 多路平衡归并排序(胜者树、败者树) 多路归并排序用作大数据集合的排序,通常因为内存资源不足,只能分段排序。 多路归并通常结合二叉树进行排序即败者树与胜者树。 胜者树: 每次筛选最小值作为根结点 败者树: 每次筛选最大值作为根节点 平衡指将大集合平分为多个相同元素个数的集合,唯一与置换置换选择排序的不同之处 # 原理 1. 将无序数组分割成多个无序数组,分割成N个就是N路排序 2. 取每个无序数组的第一个元素两两排序,选取最小值或最大值,同附近的两两排序结果再次比较,直到选出最小值 3. 将最小值放在有序
用户1175783
2019/09/10
1.4K0
# 桶排序
# 桶排序 # 原理 求出无序集合的最大值与最小值(这里的最小值指存在负数的情况),创建对应的数组长度 length=max+1 这里要处理一下负数 if min<0: length+=abs(min) 该length就是桶数组的长度,并创建这个桶数组将所有值初始化为0 然后遍历无须数组,修改桶中元素的个数(桶数组所以对应的值就是无需数组中相同值的个数) 最后只需要将桶数组中值大于0的取出来放在一个新数组中即得有序数组。 # 实现 inputArr = [ 11,1
用户1175783
2019/09/10
2950
# 原理
原理 定义一个同样大小数组来存方排序结果,并定义最小/最大值变量用来记录索引。 当无序集合的元素小于最小值时插入左边也就是`索引减一`的位置, 如果大于最大值则是在右边`索引加一`的位置, 其它情况按折半/直接方式插入。 原理图 暂无 实现 inputArr = [199383, 10, 34, -1,-32,-29, 4, 0, 34, 5, 4, 36, 1, 8, 123, 453, 1008] length = len(inputArr) sortArr = [None]*length minIn
用户1175783
2021/12/24
4120
# 快速排序
# 快速排序 # 原理 取无序集合中任意一个元素(通常选集合的第一个元素)作为分界点,将小的放左边,大的放右边,此时集合被划分三段, 然后将左边,右边集合分别使用之前的集合划分方式,直到最后每个集合中的元素都是1个, 最后合并集合即得到有序集合。 原始集合:{5,2,4,6,8,1,9,7,10,3} 取任意一个元素:5,分割后为{2,4,1,3} {5} {6,8,9,7,10} 分别取多个子集合的任意一个元素: * 第一个子集合:{1} {2} {4,3} * 第二个子集合:{5} * 第三个
用户1175783
2019/09/10
3210
# 归并排序(2-路归并排序)
# 归并排序(2-路归并排序) # 原理 将无序集合拆分成只有一个元素的有序集合,然后两两合并排序,直到合成一个包涵所有元素的有序集合。 原始集合:{5,2,4,6,8,1,9,7,10,3} 拆分直到只要一个元素的集合: {5,2,4,6,8,1,9,7,10,3} => {5}{2}{4}{6}{8}{1}{9}{7}{10}{3} 合并排序: {5}{2}{4}{6}{8}{1}{9}{7}{10}{3}=>{5,2}{4,6}{8,1}{9,7}{10,3}=>{2,5}{4,6}{1,8}{7,9
用户1175783
2019/09/10
5780
7.7.4 置换选择排序(生成初始归并段)
7.7.3讨论了如何使用m路归并来减少磁盘访问次数。从第7.7.2的讨论可知,减少初始归并段个数r也可以减少归并趟数S。若总的记录个数为n,每个归并段的长度为L,则归并段的个数m=[n/L]。如果采用前面介绍的内部排序方法,将得到长度相同的初始归并段。因此,必须探索新的算法俩生成初始归并段,这就是本节介绍的置换-选择算法。
week
2018/08/24
1.5K0
# 基数排序(支持负数)
# 基数排序(支持负数) # 原理 将无序集合按照个位数大小排序,再按照10位数大小排序,依次增高位数,直到某个位数大于最大数的位数时结束排序。 原始数组:{12,65,34,695,235,2,6,95,46} 按个位排序: 个位是0:{} 个位是1:{} 个位是2:{12,2} 个位是3:{} 个位是4:{34} 个位是5:{65,695,235,95} 个位是6:{6,46} 个位是7,8,9的都是:{} 得到新集合:{12,2,34,65,695,235,95,6,46} 按十位排序: 十位是0:{
用户1175783
2019/09/10
1.8K0
外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树
注意:在建立基本的分块之前,外存的每个小分块要先进行内部排序,保证这16个分块内部是有序的。
小徐在进步
2024/10/11
3620
外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树
# 表插入排序
# 表插入排序 # 原理 这种方式需要引入一个有序循环集合,并在有序循环集合中将最小、最大的元素分别标记为first、end 取无序集合的的每个元素从有序集合的最小元素开始比较直到匹配的合适的位置插入。 与2-路插入排序原理比较,引入了链表的概念,避免元素的移动。 # 原理图 暂无 # 实现 nputArr = [ 11,10,199383, 34, -1,-32,-29, 4, 0, 34, 5, 4, 36, 1, 8, 123, 453, 1008] length = len(inputArr)
用户1175783
2019/09/10
6290
# 树形选择排序(锦标赛排序)
# 树形选择排序(锦标赛排序) # 原理 将无序集合进行两两分组排序,将找出的每组的最小值再进行两两排序, 以此模式直到找出最小的值,将这个值纪录下来并从第一次两两分组的排序集合中移除这个值, 然后进行第二轮,直到排序结束。 原始集合:{5,2,4,6,8,1,9,7,10,3} 第一次两两分组:{5,2} {4,6} {8,1} {9,7} {10,3} 第一轮:{5,2} {4,6} {8,1} {9,7} {10,3} => {2,4,1,7,3} => {2,4} {1,7} {3} => {2,1
用户1175783
2019/09/10
5260
Python|选择排序
外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
福贵
2020/02/17
5510
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
7750
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
JS手撕(十一) 选择排序、快速排序
只需要遍历寻找最小的数,并保存最小数的索引。遍历完之后,让最小数和已排序序列的末尾互换位置即可。
赤蓝紫
2023/01/01
2.3K0
JS手撕(十一) 选择排序、快速排序
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。
如烟花般绚烂却又稍纵即逝
2024/12/26
1830
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
排序算法讲解
0.排序算法种类和时间复杂度比较 时间复杂度指的就是一个算法执行所耗费的时间undefined 空间复杂度定义为该算法所耗费的存储空间 1.冒泡排序(Bubble Sort) 1.比较相邻的元素如果第一个比第二个大,就交换它们两个。undefined 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;undefined 3.针对所有的元素重复以上的步骤,除了最后一个;undefined 4.重复步骤1〜3,直到排序完成。 function bubbleSort
大发明家
2021/12/18
7400
经典排序算法和Python详解之(一)选择排序和二元选择排序
稳定排序和不稳定排序内部排序和外部排序时间复杂度和空间复杂度算法一:选择排序算法二:二元选择排序法(选择排序改进)
Minerva
2020/05/21
9750
十大经典排序算法(动图演示,收藏好文)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
用户1621951
2019/10/18
12.6K0
只知道冒泡排序?来看看这些排序算法
那些年我们面试时经常会被问到排序算法,还有被要求现场手写排序算法。这篇文章我们来介绍下程序员遇到过的排序算法。
Lvshen
2022/05/05
1650
只知道冒泡排序?来看看这些排序算法
十大经典排序算法最强总结(含Java代码实现)
常见的快速排序、归并排序、堆排序、冒泡排序等属于比较排序。在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。 在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。 比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。
Java团长
2018/08/03
1.5K0
那些年,让我面试头大的几个排序算法,今天终于搞懂了!
算法上,最基础的就是排序算法,几乎在面试中,或多或少会要求你手写一些基础算法。今天鱼哥带大家这些基础算法回顾下。
AI科技大本营
2019/05/22
3630
推荐阅读
相关推荐
# 多路平衡归并排序(胜者树、败者树)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验