• 数据结构之排序算法


    快速排序

    应该是数据结构中排序中最重要的一个,包括其中的patition思想,以及后面的整体的分治思想,都对于解决实际问题有很大的借鉴。快速排序是一种交换排序的方法,不稳定,也就是说如果两个相同的数,快排之后二者可能交换位置。

    1.首先来看partition函数,函数名partition(data, l, r),在data[l,r]中找到第l个数的位置i,使得i左侧的数都小于该数,i右侧的数都大于该数,并返回位置i

    def partition(data, l, r):
    	i = l
    	j = r
    	x = data[i]
    	while i<j:
    		while i<j&data[j]>x:
    			j -= 1
    		if i<j:
    			data[i] = data[j]
    			i += 1
    		while i<j&data[i]<x:
    			i += 1
    		if i<j:
    			data[j] = data[i]
    			j -= 1
    	data[i] = x
    	return i
    

    2.然后对整个数组分治递归操作即可

    def qsort(data, l, r):
    	if l<r:
    		i = partition(data, l, r)
    		qsort(data, l, i-1)
    		qsort(data, i+1, r)
    	
    	
    def quicksort(data):
    	qsort(data, 0, len(data)-1)
    

    归并排序:

    def mergearray(nums, first, mid, last):
        tmp = []
        mid2 = mid + 1
        k = 0
        while first<=mid and mid2<=last:
            if nums[first]<nums[mid2]:
                tmp[k] = nums[first]
                first += 1
            else:
                tmp[k] = nums[mid2]
                mid2 += 1
            k += 1
        while  first<=mid:
            tmp[k] = nums[first]
            first += 1
            k += 1
        while mid2<=last:
            tmp[k] = nums[mid2]
            mid2 += 1
            k += 1
        for i in range(k):
            nums[first+i] = tmp[i]
    
    
    def mergesort(nums, first, last):
        if first<last:
            mid = first + (last-first)/2
            mergesort(nums,first, mid)
            mergesort(nums, mid+1, last)
            mergearray(nums, first, mid, last)
    
    def msort(nums):
        mergesort(nums, 0, len(nums)-1)
    

      

    堆排序

    def heapAdjust(nums, i):
        lchild = 2*i+1
        rchild = 2*i+2
        max = i
        if i <= len(nums)/2:
            if lchild<=len(nums) and nums[lchild]>nums[max]:
                max = lchild
            if rchild<=len(nums) and nums[rchild]>nums[max]:
                max = rchild
        if max != i:
            nums[max], nums[i] = nums[i], nums[max]
    
    def buildHeap(nums):
        i = len(nums)/2
        while i >=0:
            heapAdjust(nums,i)
    
    def headSort(nums):
        buildHeap(nums)
        i = len(nums) - 1
        while i>=0:
            nums[i], nums[0] = nums[0], nums[i]
            heapAdjust(nums[:-1],0)
    

      

  • 相关阅读:
    [golang]text/template模板
    [golang]Go内嵌静态资源go-bindata的安装及使用
    GoCN每日新闻(2019-09-23)
    spring mvc中获取请求URL
    HBuilder搭配逍遥Android模拟器进行开发
    python 数据结构
    JDK8+Tomcat8配置https【转】
    JFinal的使用
    RESTful API 设计指南【转】
    jQuery验证控件jquery.validate.js的使用介绍
  • 原文地址:https://www.cnblogs.com/xiamaogeng/p/4461044.html
Copyright © 2020-2023  润新知