Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ค้นหาอาร์เรย์ที่มีจำนวนการเรียกการเรียงลำดับการผสานใน Python


สมมติว่าเรามีตัวเลข a และ b สองตัว เราต้องหาอาร์เรย์ที่มีค่าอยู่ในช่วง [1, a] และต้องการจำนวน b ของฟังก์ชันการเรียงลำดับการผสานแบบเรียกซ้ำ

ดังนั้น หากอินพุตเป็น a =10, b =15 ผลลัพธ์จะเป็น [3,1,4,6,2,8,5,9,10,7]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน Solve() นี่จะใช้เวลาซ้าย ขวา อาร์เรย์ b
  • ถ้า b <1 หรือซ้าย + 1 เหมือนกับขวา แล้ว
    • คืนสินค้า
  • b :=b - 2
  • กลาง :=(ซ้าย + ขวา) / 2
  • temp :=array[mid - 1]
  • array[mid-1] :=array[กลาง]
  • อาร์เรย์[กลาง] :=อุณหภูมิ
  • แก้ (ซ้าย กลาง อาร์เรย์ b)
  • แก้(กลาง ขวา อาร์เรย์ b)
  • จากวิธีหลัก ให้ทำดังนี้ -
  • ถ้า b mod 2 เหมือนกับ 0 แล้ว
    • แสดง "ไม่มี"
    • คืนสินค้า
  • array :=อาร์เรย์ขนาด n + 1 และเติมด้วย 0
  • array[0] :=1
  • สำหรับฉันในช่วง 1 ถึง a ทำ
    • array[i] :=i + 1
  • b :=b - 1
  • แก้(0, a, อาร์เรย์, b)
  • ส่งคืนอาร์เรย์ a

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(left,right,array,b):
   if (b < 1 or left + 1 == right):
      return
   b -= 2
   mid = (left + right) // 2
   temp = array[mid - 1]
   array[mid-1] = array[mid]
   array[mid] = temp
   solve(left, mid, array, b)
   solve(mid, right, array, b)
def find_arr(a,b):
   if (b % 2 == 0):
      print("None")
      return
   array = [0 for i in range(a + 2)]
   array[0] = 1
   for i in range(1, a):
      array[i] = i + 1
   b -=1
   solve(0, a, array, b)
return array, a
a = 10
b = 15
array, size = find_arr(a, b)
print(array[:size])

อินพุต

10,15

ผลลัพธ์

[3, 1, 4, 6, 2, 8, 5, 9, 10, 7]