2014年09月19日
Posted by 屋台ブルー at
2014年09月19日00:00 Comment(0)
Swiftで遊ぼう! - 70 プログラマの考え方 10 アレーの所でソート
参考文献:プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!←勉強になるよ初めての人にいいかも。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/
「プロおも本」で配列の基礎知識の説明を読んでいると、配列の要素を特定の順番に並べ替えることをソートと呼んでいる。ソートのアルゴリズムの話をしていると一冊まるごと本がかけてしまうため、この本では実践的な2種類のソートしか取りあげていない。高速で使いやすいソートと美しくて理解しやすいソートで、前者は標準ライブラリ関数の「qsort」で、後者が「挿入ソート」である。
しかし、この「qsort」は、「C++」の標準ライブラリなんでSwiftでは必要ない。じゃあSwiftの標準ライブラリを確認してみると、The Swift Programming Languageブックのクロージャ(Closures)のセクション *このブログにもクロージャの説明があるよにSwiftの標準ライブラリ「sorted」という関数があった。この関数は、与えたアレー型の値と同じ型とサイズで新しいアレー型の値を返す。以前読んだところなのにすっかり忘れている(^^;)
sorted関数は2つの引数が必要で、それは以下の2つだ:
1) 特定の型で構成されたアレー型値
2) 2つの同じ型を引数として受け取り、Bool値を返す関数
2) のところをみると、「プロおも本」で書かれている「qsort」と似ていますね。このソートは比較関数を引数として渡しているからだ。
var numbers:[Int] = [9, 4, 3, 1, 6, 7]
func forwads(s1: Int, s2: Int) -> Bool {
return s1 < s2
}
var numbersA = sorted(numbers, forwads)
for item in numbers {
print("\(item)")
}
for item in numbersA {
print("\(item)")
}
// 943167
// 134679
ここまではSwiftの標準ライブラリsorted関数の使い方だったので頭は使わなくてもできる。次の「挿入ソート」ですが、プログラマさんには常識らしいのですが、私には新鮮でした。なるほど、ソートのアルゴリズムってこうするんですね。知らなかったです。
var numbers:[Int] = [9, 4, 3, 1, 6, 7]
let start = 0
let end = numbers.count - 1
for index in (start+1)...end {
var j:Int
for j = index ; j > start && numbers[j-1] > numbers[j] ; --j {
var temp = numbers[j-1]
numbers[j-1] = numbers[j]
numbers[j] = temp
}
}
ここで、もう一つプログラマの専門用語を覚えた。「ハードコーティング」という単語だ。上に書いたコードの中でvar start = 0をすることで、start変数を使えば、コードが読みやすくなるし汎用化しやすいが、あえて「0」を使ってコードすることを「ハードコーディング」と呼ぶようです。ちょっとプログラマ的になってきたよ。
さて、2つのforループを絡めて、アレー型の要素を交換している。ます、アレー型の最初の要素から順番にindexを増やしていって、内側のforループで進んだindexから前に向かって進んで( start && numbers[j-1] > numbers[j] )がtrueであるかぎり要素を交換し続ける。という時間はかかるけど分かり易いコーディングになっている。
しかし、問題は、内側のforの使い方が、旧C++的で、Swift的じゃないですよね。どなたか教えてください。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/
「プロおも本」で配列の基礎知識の説明を読んでいると、配列の要素を特定の順番に並べ替えることをソートと呼んでいる。ソートのアルゴリズムの話をしていると一冊まるごと本がかけてしまうため、この本では実践的な2種類のソートしか取りあげていない。高速で使いやすいソートと美しくて理解しやすいソートで、前者は標準ライブラリ関数の「qsort」で、後者が「挿入ソート」である。
しかし、この「qsort」は、「C++」の標準ライブラリなんでSwiftでは必要ない。じゃあSwiftの標準ライブラリを確認してみると、The Swift Programming Languageブックのクロージャ(Closures)のセクション *このブログにもクロージャの説明があるよにSwiftの標準ライブラリ「sorted」という関数があった。この関数は、与えたアレー型の値と同じ型とサイズで新しいアレー型の値を返す。以前読んだところなのにすっかり忘れている(^^;)
sorted関数は2つの引数が必要で、それは以下の2つだ:
1) 特定の型で構成されたアレー型値
2) 2つの同じ型を引数として受け取り、Bool値を返す関数
2) のところをみると、「プロおも本」で書かれている「qsort」と似ていますね。このソートは比較関数を引数として渡しているからだ。
var numbers:[Int] = [9, 4, 3, 1, 6, 7]
func forwads(s1: Int, s2: Int) -> Bool {
return s1 < s2
}
var numbersA = sorted(numbers, forwads)
for item in numbers {
print("\(item)")
}
for item in numbersA {
print("\(item)")
}
// 943167
// 134679
ここまではSwiftの標準ライブラリsorted関数の使い方だったので頭は使わなくてもできる。次の「挿入ソート」ですが、プログラマさんには常識らしいのですが、私には新鮮でした。なるほど、ソートのアルゴリズムってこうするんですね。知らなかったです。
var numbers:[Int] = [9, 4, 3, 1, 6, 7]
let start = 0
let end = numbers.count - 1
for index in (start+1)...end {
var j:Int
for j = index ; j > start && numbers[j-1] > numbers[j] ; --j {
var temp = numbers[j-1]
numbers[j-1] = numbers[j]
numbers[j] = temp
}
}
ここで、もう一つプログラマの専門用語を覚えた。「ハードコーティング」という単語だ。上に書いたコードの中でvar start = 0をすることで、start変数を使えば、コードが読みやすくなるし汎用化しやすいが、あえて「0」を使ってコードすることを「ハードコーディング」と呼ぶようです。ちょっとプログラマ的になってきたよ。
さて、2つのforループを絡めて、アレー型の要素を交換している。ます、アレー型の最初の要素から順番にindexを増やしていって、内側のforループで進んだindexから前に向かって進んで( start && numbers[j-1] > numbers[j] )がtrueであるかぎり要素を交換し続ける。という時間はかかるけど分かり易いコーディングになっている。
しかし、問題は、内側のforの使い方が、旧C++的で、Swift的じゃないですよね。どなたか教えてください。