python实现分治法排序

# -*- coding: utf-8 -*-
"""
Created on Wed May 14 16:14:50 2014

@author: lifeix
"""

def merge(a, start, mid, end):
    if start == end:
        return a
    if mid == 0:
        return a

    temp1 = a[start:mid]
    m1 = len(temp1)/2
    print temp1,‘----‘,m1
    newtemp1 = merge(temp1,0,m1,len(temp1))
    temp2 = a[mid:end]

    m2 = len(temp2)/2

    newtemp2 = merge(temp2,0,m2,len(temp2))
    #通过插入排序合并被排序的两个子数组
    for i in range(len(newtemp1)):
        t = newtemp1[i]
        for j in range(len(newtemp2)):
            if t > newtemp2[j]:
                temp = t

                t = newtemp2[j]

                newtemp2[j] = temp
        newtemp1[i] = t

    return newtemp1+newtemp2

a = [1,5,3,78,4,56,21]
mid = len(a)/2
merge(a,0,mid, len(a))

python实现分治法排序,布布扣,bubuko.com

时间: 2024-10-05 11:19:00

python实现分治法排序的相关文章

分治法排序之归并排序

使用分治法的两路合并排序算法: 将待排序的元素序列一分为二,得到长度基本相等的两个子序列,分别排序. 如果子序列较长,还可继续细分,直到子序列的长度不超过1为止. 当分解所得的子序列已排列有序时,将两个有序子序列合并成一个有序子序列,得到原问题的解. 合并方法: 比较两序列中的最小值,输出其中较小者,然后重复此过程,直到其中一个队列为空时, 如果另一个队列还有元素没有输出,则将剩余元素依次输出. #include<stdio.h>#define N 100int merge(int *a, i

python使用分治法找序列最大值

最近上算法导论课,说道分治法,回来想用python写写程序练练手,于是模仿一通写了如下的代码: __author__ = 'day' def ArrayMaxMin(Array): return max(Array) def Sort(init_Array): if len(init_Array) <= 2: print (ArrayMaxMin(init_Array)) else: init_Array=[init_Array[i:i+2] for i in range(0,len(init_

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

分治法-合并排序和快速排序

分治法是按照以下方案工作的: 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时会利用另一种算法以提高效率) 如果必要的话,合并较小问题的解,以得到原始问题的解 分治法的流程: 4.1 合并排序 合并排序是成功应用分治技术的一个完美例子(书上说的). 对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 代码实现: /** * 合并排序 * @au

合并排序(分治法)

使用分治法进行合并排序,问题描述参见:https://www.cnblogs.com/jingmoxukong/p/4308823.html 算法核心: //merge_sort.h #ifndef MERGE_SORT_H #define MERGE_SORT_H template <class Type> void MergeSort(Type a[], int n); #include "merge_sort.template" #endif //merge_sort

用分治法解决最近点对问题:python实现

最近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.需要说明的是理论上最近点对并不止一对,但是无论是寻找全部还是仅寻找其中之一,其原理没有区别,仅需略作改造即可.本文提供的算法仅寻找其中一对. 解决最近点对问题最简单的方法就是穷举法,这样时间复杂度是平方级,可以说是最坏的策略.如果使用分治法,其时间复杂度就是线性对数级,这样大大提高了效率. 首先用分治法解决该问题的基本思路可以参考 http://blog.csdn.net/lishuhuakai/arti

分治法计算最大字数组(Python)

比如你获得了一个投资某个股票的机会,并且,你已经准确知道了将来几天这一只股票的相对于前一天的插值,比如为[13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7],那么就有一个问题,从那一天买入,哪一天卖出获益最大?这里就是一个最大字数组问题. 最大字数组问题:在一个数组中找出最大的非空连续子数组 常见方法,暴力求解找出所有的组合,共有C(n,2)种选择,时间复杂度Theta(n^2) 分治法求解最大字数组问题,计算复杂度theta(nlogn) 分

专题:分治法

分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些