利用排序演算法解決的一些問題(Python實現)

2021-09-05 09:01:55 字數 3662 閱讀 2257

摘要:排序演算法的一些實際應用,如小和問題,逆序對問題,基於非比較排序的相鄰兩數最大差值問題,

# -*- coding: utf-8 -*-

"""@project : python_

@author : 'zheng guoliang'

@file : class2.py

@function :

@time : 2018/12/23 15:51

"""import random

import copy

class sort_use(object):

# 小和問題 時間複雜度0(nlogn) 空間複雜度0(n)

def small_sum(self,nums):

if len(nums)<2:

return 0

return self.merge_sort(nums,0,len(nums)-1)

def merge_sort(self,nums,l,r):

if l>=r:

return 0

mid=l+((r-l)>>1)

return self.merge_sort(nums,l,mid)+self.merge_sort(nums,mid+1,r)+self.merges(nums,l,mid,r)

def merges(self,nums,l,mid,r):

i=lj=mid+1

help=

res=0

while i<=mid and j<=r:

if nums[i]nums[j]:

res+=nums[j]

return res

# 逆序對問題 時間複雜度0(nlogn) 空間複雜度0(n)

def reverse_order(self,nums):

if len(nums)<2:

return 0

return self.merge_sort_order(nums,0,len(nums)-1)

def merge_sort_order(self,nums,l,r):

if l>=r:

return 0

mid=l+((r-l)>>1)

return self.merge_sort_order(nums,l,mid)+self.merge_sort_order(nums,mid+1,r)+self.merges_order(nums,l,mid,r)

def merges_order(self,nums,l,mid,r):

i=lj=mid+1

res=0

help=

while i<=mid and j<=r:

if nums[i]<=nums[j]:

i+=1

else:

res+=(mid-i+1)

j+=1

while i<=mid:

i+=1

while j<=r:

j+=1

for i in range(0,r-l+1):

nums[i+l]=help[i]

return res

# 逆序對問題 時間複雜度0(n^2) 空間複雜度0(1)

def reverse_order1(self,nums):

if len(nums)<2:

return 0

res=0

for i in range(0,len(nums)-1):

for j in range(i+1,len(nums)):

if nums[i]>nums[j]:

res+=1

return res

#若排序後,相鄰兩數最大差值,不能用非基於比較的排序 時間複雜度0(n) 空間複雜度0(n)

def max_gap(self,nums):

if len(nums)<2:

return 0

max=nums[0]

min=nums[0]

for i in range(1,len(nums)):

max=max(max,nums[i])

min=min(min,nums[i])

if max == min :

return 0

lens=len(nums)

max_vec=[0 for i in range(lens+1)]

min_vec=[0 for i in range(lens+1)]

has_vec=[false for i in range(lens+1)]

for i in range(lens):

pos=int((nums[i]-min)*lens/(max-min))

max_vec[pos]=max(max_vec[pos],nums[i]) if has_vec[pos] else nums[i]

min_vec[pos]=min(min_vec[pos],nums[i]) if has_vec[pos] else nums[i]

has_vec[pos]=true

res=0

last_max=max_vec[0]

for i in range(1,lens+1):

if has_vec[i]:

res=max(res,min_vec[i]-last_max)

last_max=max_vec[i]

return res

#若排序後,相鄰兩數最大差值,基於比較的排序 時間複雜度0(nlogn) 空間複雜度0(1)

def max_gap1(self,nums):

if len(nums)<2:

return 0

nums.sort()

res=0

for i in range(1,len(nums)):

res=max(res,nums[i]-nums[i-1])

return res

def generate_data(n, l, r):

list =

for i in range(n):

a = random.randint(l, r)

# print(a,end=" ")

# print(end="\n")

return list

def print_data(nums):

for i in nums:

print(i, end=" ")

if __name__ == '__main__':

zgl=sort_use()

flag=true

for i in range(1,1000):

nums=generate_data(100,1,100)

nums1=copy.deepcopy(nums)

res=zgl.max_gap(nums)

res1=zgl.max_gap1(nums1)

if res!=res1:

print("error , res:",res," res1:",res1)

flag=false

break

if not flag:

print("error")

else:

print("ok")

近期要解決的一些問題

1 多微機上的多虛擬機器互聯問題 馬上進入碩士二年級的學習,因為本人的研究方向目前是集於大資料的應用,為了可以更好的 真實的生產環境,我想搭建乙個集於hdfs與spark的多節點計算集群,利用手頭上本導師的學生手上的幾台台式計算機,在上面分別依照效能執行幾台虛擬機器,最後互聯起來,利用實驗室已經建成...

利用二進位制解決一些問題

一 0和1 簡單規則 二 簡單題目總結 1 已知數n,檢測其k位 二進位制 是否置位 是否為1 n 1說明 1 左移 k 1位,變為 第k位為1,其他的位置為0.根據公式a和公式c,n的二進位制除k位之外,均變成0,而第k位與1 之後,原來是什麼還是什麼。如果是1,則結果一定大於0.如果是0.則最終...

利用反射建立物件的一些問題

所要構造的類如下所示 package getclass public class people private people string name public string getname public void setname string name override public strin...