JAVA基礎知識点復習(五)配列と並べ替え
26726 ワード
アウトライン 1次元配列 二次元配列 バブルソート 単純選択ソート クイックソート 二分検索 このシリーズの博文は主に自分が前に勉強したjavaの基礎内容をまとめ、まとめています.
1 D配列
配列は、同じタイプの複数のデータを格納し、0から番号付けし、要素の操作を番号(インデックス)で完了します.
配列が定義されると、使用するメモリ領域が固定されるため、配列は可変ではありません.
1次元配列定義方式は3種類あり,2,3種類の書き方が一般的である.
2 D配列2 Dはいれつ
配列のネスト配列、2、3種類の書き方が一般的です
2 D配列は実際には1つの行列であり、動的初期化にとって
もちろんN次元配列を定義することもできます[犬頭]
ちょっと変な書き方
バブルソート
2つの隣接する要素を並べ替え、最大(最小)を最後に配置します.
時間複雑度O(N^2)
1回目の内サイクルはn−1回、次いでn−2回、n−3回、・・・、最後の内サイクルは1回比較される.
等差数列加算(((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2(((n−1)+1)(n−1)/2=n(n−1)/2 BigO表現:最高項のみを保持し,最高項定数を除去する
最終導出はO(N^2)
単純選択ソート
i番目の桁数をその後のすべての数と比較し、より小さい(より大きい)ものに遭遇した場合はその角標を記憶し、各ラウンドが終了して角標が変動した場合は交換し、i番目の数は最小(最大)である
時間複雑度O(N^2)
1回目の内サイクルはn−1回、次いでn−2回、n−3回、・・・、最後の内サイクルは1回比較される.
等差数列と((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2=n(n−1)/2を求めて最終的にO(N^2)と導いた.
クイックソート
時間複雑度O(Nlogn)ポインタ交換法
にぶんたんさく
1 D配列
配列は、同じタイプの複数のデータを格納し、0から番号付けし、要素の操作を番号(インデックス)で完了します.
配列が定義されると、使用するメモリ領域が固定されるため、配列は可変ではありません.
1次元配列定義方式は3種類あり,2,3種類の書き方が一般的である.
// ( )
int[] arr = new int[]{1,2,3};
// ( )
int[] arr1 = {1,2,3};
// ( )
int[] arr2 = new int[3];
// , ,
System.out.println(arr2.length);
//
for (Integer val : arr) {
System.out.print(val);
}
//
System.out.println(Arrays.toString(arr));
2 D配列2 Dはいれつ
配列のネスト配列、2、3種類の書き方が一般的です
// ( )
int[][] arrs = new int[][]{{1}, {2, 3}, {4, 5, 6}};
// ( )
int[][] arrs1 = {{}, {}, {}};
// ( )
int[][] arrs2 = new int[2][3];
// ( )
int[][] arrs3 = new int[3][];
System.out.println(arrs.length); //
//
for (int[] arr : arrs) {
for (Integer val : arr) {
System.out.print(val);
}
}
//
System.out.println(Arrays.deepToString(arrs));
2 D配列は実際には1つの行列であり、動的初期化にとって
new int[][]
の最初の[]
はこの2 D配列の中に何個の1次元配列があるかを表し、2番目の[]は1次元配列の容量を表し、最初の[]
は空ではないもちろんN次元配列を定義することもできます[犬頭]
int[][][][][] i = new int[2][2][2][2][2];
System.out.println(Arrays.deepToString(i));
ちょっと変な書き方
int x []; //
int x1 [][]; //
int [] x2 []; //
int[] x3, y[]; // x3 ,y
バブルソート
2つの隣接する要素を並べ替え、最大(最小)を最後に配置します.
時間複雑度O(N^2)
1回目の内サイクルはn−1回、次いでn−2回、n−3回、・・・、最後の内サイクルは1回比較される.
等差数列加算(((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2(((n−1)+1)(n−1)/2=n(n−1)/2 BigO表現:最高項のみを保持し,最高項定数を除去する
最終導出はO(N^2)
private static void bubbleSort(int[] arr){
for (int i=0; i<arr.length-1; i++) {
for (int j=0; j<arr.length-1-i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
単純選択ソート
i番目の桁数をその後のすべての数と比較し、より小さい(より大きい)ものに遭遇した場合はその角標を記憶し、各ラウンドが終了して角標が変動した場合は交換し、i番目の数は最小(最大)である
時間複雑度O(N^2)
1回目の内サイクルはn−1回、次いでn−2回、n−3回、・・・、最後の内サイクルは1回比較される.
等差数列と((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2((n−1)+1)(n−1)/2=n(n−1)/2=n(n−1)/2を求めて最終的にO(N^2)と導いた.
private static void selectSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[index] > arr[j]) {
index = j;
}
}
if (index != i) {
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
クイックソート
時間複雑度O(Nlogn)ポインタ交換法
private static void quickSort(int[] arr, int left, int right){
if(left >= right){
return;
}
// i, j, pivot
int i = left, j = right, pivot = arr[i];
// j , ij , i
while(i < j){
// j
while (arr[j] >= pivot && i < j) {
j--;
}
// i
while (arr[i] <= pivot && i < j){
i++;
}
//
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// ,
arr[left] = arr[i];
arr[i] = pivot;
//
quickSort(arr, left, i - 1);
//
quickSort(arr, i + 1, right);
}
にぶんたんさく
private static int binarySearch(int[] arr, int key){
int min = 0, mid, max = arr.length-1;
while(min <= max){
mid = (min + max)/2;
if(key > arr[mid]){
min = mid + 1;
}else if(key < arr[mid]){
max = mid - 1;
}else {
return mid;
}
}
return -1;
}