কম্পিউটার টিউটোরিয়াল

পাইথনে অ্যারে সর্ট করার জন্য ন্যূনতম সোয়াপ সংখ্যা খুঁজে বের করার প্রোগ্রাম


আমাদের একটি অ্যারে আছে nums এবং আমাদের সোয়াপের সংখ্যা বের করতে হবে যাতে nums যেকোনো ক্রমে (আরোহী বা অবরোহী) সর্টেড হয়।

উদাহরণস্বরূপ, ইনপুট nums = [2, 5, 6, 3, 4] হলে আউটপুট হবে 2 কারণ প্রাথমিক nums = [2, 5, 6, 3, 4]। যদি 6 এবং 4 সোয়াপ করি, অ্যারে হবে [2,5,4,3,6]। তারপর 5 এবং 3 সোয়াপ করলে অ্যারে হবে [2,3,4,5,6]। তাই আরোহী ক্রমে সর্ট করার জন্য ২টি সোয়াপ লাগে।

সমাধানের ধাপসমূহ

  • swap_count() ফাংশন ডিফাইন করুন। এটি input_arr ইনপুট নেবে:

    • pos := input_arr-এর প্রতিটি আইটেমের জন্য (item_position, item) টাপল ধারণকারী একটি নতুন লিস্ট

    • pos-কে input_arr-এর আইটেম অনুযায়ী সর্ট করুন

    • cnt := 0

    • index = 0 থেকে input_arr-এর আকার পর্যন্ত লুপ চালান:

      • যখন True থাকাকালীন লুপ চালান:

        • যদি pos[index][0] == index হয়, তবে:

          • লুপ থেকে বেরিয়ে আসুন

        • অন্যথায়:

          • cnt := cnt + 1

          • swap_index := pos[index][0]

          • pos[index] এবং pos[swap_index]-এর মান সোয়াপ করুন

    • cnt রিটার্ন করুন

  • মূল ফাংশন থেকে নিচের কাজ করুন:

    • min(swap_count(input_arr), swap_count(input_arr[::-1])) রিটার্ন করুন

উদাহরণ

নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:

def swap_count(input_arr):
    pos = sorted(list(enumerate(input_arr)), key=lambda x: x[1])
    cnt = 0
    for index in range(len(input_arr)):
        while True:
            if pos[index][0] == index:
                break
            else:
                cnt += 1
                swap_index = pos[index][0]
                pos[index], pos[swap_index] = pos[swap_index], pos[index]
    return cnt

def solve(input_arr):
    return min(swap_count(input_arr), swap_count(input_arr[::-1]))

nums = [2, 5, 6, 3, 4]
print(solve(nums))

ইনপুট

[2, 5, 6, 3, 4]

আউটপুট

2
  1. পাইথনে অ্যারের যোগফল বের করা

  2. পাইথনে অ্যারে থেকে সর্বোচ্চ এলিমেন্ট বের করা

  3. পাইথনে ইনসারশন সর্ট প্রোগ্রাম

  4. পাইথন প্রোগ্রাম: ইনসারশন সোর্ট অ্যালগরিদম