6月28日オンライン分
ソーティング まとめ中
・ソーティング(整列)
データをルールに従って並び替える作業 [5,3,2,6,1,4]
データが小さいほうから大きいほうに:昇順 [1,2,3,4,5,6]
データが大きいほうから小さいほうに:降順 [6,5,4,3,2,1]
・一番小さいソート
データとデータの交換
int a = 1, b = 5;\\ a:1 a:5 \\ b:5 b:1\\ 1 5 ①a = b; a:5, b:5 ②b = a; b:5, a:5 5 5
temporary変数(一時的な作業用変数)をつかう。
int tmp=0;//当たり障りない値で初期化 ①tmp = a; ②a = b; ③b = tmp;
これで、一番小さいソート=2個のデータの入れ替えができる。
int a[6] ={5,3,2,6,1,4}; //→1,2,3,4,5,6に並べ替えたい(整列問題)
min c c
[5] [0] [5,3,2,6,1,4] c=0の初期状態
c m
[1] [0] [5,3,2,6,1,4] 最小値探索(index 0~5)
[1] [0] [1,3,2,6,5,4] cm交換
c o c
[1] [1] [1,3,2,6,5,4] cを1増やす
c o c
[3] [1] [1,3,2,6,5,4] c=1の初期状態
c o c m
[3] [1] [1,3,2,6,5,4] 最小値探索(index 1~5)
c o
[3] [1] [1,2,3,6,5,4] cm交換
c o o
[3] [2] [1,2,3,6,5,4] cを1増やす
c o o c
[3] [2] [1,2,3,6,5,4] c=2の初期状態
c o o cm
[3] [2] [1,2,3,6,5,4] 最小値探索
c o o
[3] [2] [1,2,3,6,5,4] cm交換(動かず)
c o o o c
[3] [3] [1,2,3,6,5,4] c++
c o o o c
[6] [3] [1,2,3,6,5,4] c=3の初期状態
c o o o c m
[6] [3] [1,2,3,6,5,4] 最小値探索
c o o o o
[6] [3] [1,2,3,4,5,6] cm交換
c o o o o c
[6] [4] [1,2,3,4,5,6] c++
c o o o o o o
[6] [4] [1,2,3,4,5,6] cm交換(動かず)(省略)
上の方法:最小値を選択し、左から順番にソート済み列として並べていく方法(選択ソート)
単純選択法、素朴な方法、基本選択法、逐次決定法(Selection Sort)
効率は、当然よくない。
データが、10個のソート。
1回目線形探索 10個+入れ替え1
2回目線形探索 9個+入れ替え1
8回目線形探索 8個+入れ替え1
…
10回目線形探索 1個+入れ替え1
N個のデータ→ N+(N-1)+(N-2)+ … + 1
・ソーティングアルゴリズムには速い遅いがある。
・メモリを多く使うものと、少なく使うものがある。
著名なソートアルゴリズム
・選択ソート
・バブルソート
・挿入ソート
・シェルソート ↑あまり効率よくない
—————-
・マージソート ↓早いと噂のソート
・クイックソート
(↑情報処理技術者試験でよく出るソートアルゴリズム)
時間計算量
・比較、代入等の操作の回数=計算の手数の事(計算ステップ数)
空間計算量
・メモリにどのぐらいアクセスして、どのぐらいメモリを占有するか?
時間計算量が少ない(計算ステップが少なく速い)アルゴリズム=>メモリを大量に使う
↑逆の関係になることが多い
メモリを大量に使う => 計算ステップは少ない
計算ステップが多い => メモリ使用量は少ない
(時間と空間の)トレードオフの関係という
プログラムを見てみる
変数の有効範囲=スコープ(scope)=変数がどこから見えて、どこから見えないか
同じ有効範囲内には、同じ名前の変数は作れない。
有効範囲が異なる{}内では同じ名前が使用できて、一番近い宣言のものが優先される
{
int b=0;
{
//変数を宣言した場所から}まで変数は有効
//float b=10;
//同じ名前の変数がなければ、自分のいるかっこの外(上で宣言済みなら)の変数は見える。
//ここでint b=0は参照可能 float b=10がある場合は参照できない(名前がかぶってるので、内側優先)
} //float b=10;はここまで有効
//この位置では、float b=10は参照できない
}//int b=0はここまで有効
int main()
{
int a=10,b=20;
int tmp;
tmp = a;
a = b;
b = tmp;
//a:20 b:10
}
関数内での値の入れ替えはアドレス参照で、解決可能
0x12 0x13 0x14 | 10 | 20 |???| a b tmp
変数のアドレスを入れ替えるか、アドレスの先の値を直接入れ替えるかする
変数のアドレスを入れておく変数 = ポインタ
int *a = nullptr;
int *b = nullptr;
a = &va;
b = &vb;