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;