HOME»基本情報技術者試験掲示板»過去問をpythonへ書き起こし
投稿する

過去問をpythonへ書き起こし [5118]

 アルゴリズム初心者さん(No.1) 
アルゴリズムの勉強のためpython(googlecolab)を使い始めました。
試しに過去問をpythonへ書き起こしをしていますがうまくいきません、どこが悪いのか教えてください。平成22年春、午後問8で書き起こしをしています。

<自分なりに書いたプログラム>
nums = [7,4,3,5,6,1,2]


n = len(nums)
def merge(nums,num1,num2,slist1,slist2):
    merge_sort(nums, slist1, num1)
    merge_sort(nums, slist2, num2)
    merge(nums,num1,num2,)


def merge_sort(nums):

    if len(nums) > 1:
        return nums

num1 = len(nums) //2
num2 = len(nums) - num1

slist1 = [0] * (num1)
slist2 = [0] * (num2)

for i in range(0 , num1):
        slist1[i] = nums[i]

for j in range(0 , num2):
        slist2[j] = nums[num1 + j]

i = 0
j = 0
k = 1

while i < num1 and j < num2 :
        if slist1[i] < slist2[j]:
            nums[i + j] = slist1[i]
            i += 1
        else:
            nums[i + j] = slist2[j]
            j += 1
        k += 1



while i < num1 or j < num2:
        if i < num1:
           nums[i + j] = slist1[i]
           i += 1
           k += 1
        else:
           nums[i + j] = slist2[j]
           j += 1
           k += 1


print(nums)
2023.10.02 22:23
まーぼさん(No.2) 
FE シルバーマイスター
細かいところが…とかではなく大きく違っているところがあるのでもう少し注意深く見てみてください。
2023.10.02 23:29
まーぼさん(No.3) 
FE シルバーマイスター
いろいろヒントを置いておきますね。

・プログラムSortは再帰関数だが、副プログラムMergeは再帰関数ではない。

・merge_sort(nums, slist1, num1)という関数を呼び出しているが、定義されているのはmerge_sort(nums)

・インデントを確認すること。
一番重大なのがここ

def merge_sort(nums):

    if len(nums) > 1:
        return nums

merge_sortの定義がこれで終わりとみなされます。
2023.10.03 00:26
 アルゴリズム初心者さん(No.4) 
ありがとうございます。いろいろ試してみます。
2023.10.03 06:55
まーぼさん(No.5) 
FE シルバーマイスター
考えてみても分からなかったら聞いてください。
2023.10.03 17:02
 アルゴリズム初心者さん(No.6) 
なんとかできたがこれじゃない感があります。

def merge_sort(nums):
    if len(nums) <= 1:
        return nums

    nums1 = len(nums) // 2
    slist1 = nums[:nums1]          #ここをfor文にしたい
    slist2 = nums[nums1:]



    slist1 = merge_sort(slist1)
    slist2 = merge_sort(slist2)



    i, j, k= 0, 0, 0
    while i < len(slist1) and j < len(slist2):
        if slist1[i] <= slist2[j]:
            nums[k] = slist1[i]
            i += 1
        else:
            nums[k] = slist2[j]
            j += 1
        k += 1

    while i < len(slist1) or j < len(slist2):
        if i < len(slist1):
            nums[k] = slist1[i]
            i += 1
            k += 1
        else:
            nums[k] = slist2[j]
            j += 1
            k += 1

    return nums

if __name__ == '__main__':
    nums = [7,4,3,5,6,1,2]
    print(merge_sort(nums))
2023.10.04 21:01
まーぼさん(No.7) 
FE シルバーマイスター
def merge_sort(list,size):
  
  if size > 1:
    
    num1 = size//2
    num2 = size-num1

    slist1 = [0]*num1
    slist2 = [0]*num2

    for i in range(num1):
         
      slist1[i] = list[i]
    
    for i in range(num2):
         
      slist2[i] = list[num1+i]
    
    merge_sort(slist1,num1)
    merge_sort(slist2,num2)
    merge(slist1,num1,slist2,num2,list)

def merge(slist1,num1,slist2,num2,list):

  i = 0
  j = 0

  while i < num1 and j < num2 :

    if slist1[i] < slist2[j]:
      list[i + j] = slist1[i]
      i += 1
    else:
      list[i + j] = slist2[j]
      j += 1

  while i < num1 or j < num2:
          
    if i < num1:
      list[i + j] = slist1[i]
      i += 1
    else:
      list[i + j] = slist2[j]
      j += 1
      
import numpy as np

size = 20

list = [x for x in range(size)]

np.random.shuffle(list)

print(f"並び替え前:{list}")

merge_sort(list,size)

print(f"並び替え後:{list}")
こんな感じじゃないですかね。スライス使ってもいいですけど。
2023.10.04 21:44
 アルゴリズム初心者さん(No.8) 
ありがとうございます。無理に問題文の順番通りにしようとすると余計に難しく感じるには自分だけでしょうか?また別の問題にも挑戦します。
2023.10.05 06:51
まーぼさん(No.9) 
FE シルバーマイスター
あくまで私はですが、問題の通りの方が整理されていて理解しやすいと思います。
2023.10.05 08:30
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop