1.バブリングソート
とは、左端から開始し、ソートするシーケンスに繰り返しアクセスし、一度に2つの要素を比較し、順序が間違っている場合はそれらを交換することを意味します。何度も何度も比較することで、要素が大きくなると、交換によってシーケンスの先頭にゆっくりと「フロート」するため、「バブル」という名前が付けられます。これは安定したソートアルゴリズムです。
実装:
1。従来の実装
public class BubbleSort {
public static void main(String[] args) {
int[] target = {
1,7,6,4,5,2,9,4,6};
//临时存储数据
int temp = 0;
for (int i = 0; i < target.length; i++) {
for (int j = 0; j < target.length-1; j++) {
//当左边的比右边的数字大则交换数据
if(target[j] > target[j+1]) {
temp = target[j];
target[j] = target[j+1];
target[j+1] = temp;
}
}
}
for (int i = 0; i < target.length; i++) {
System.out.print(target[i] + " ");
}
}
}
上記のループのいくつかは実際には冗長であることがわかります。なぜですか?バブリングするたびに次の順序がすでに配置されているため、それらについて判断を繰り返す必要がないため、外側のループは配列の最後から始まります。ここでは、ループがループダウンするたびに、外側のループが始まります。後者はソートされているため、1減少します。
2.最適化は次のように実装されます。
public class BubbleSort {
public static void main(String[] args) {
int[] target = {
1,7,6,4,5,2,9,4,6};
//临时存储数据
int temp = 0;
//优化后
for (int i = target.length-1; i > 1; i--) {
for (int j = 0; j < i; j++) {
if(target[j] > target[j+1]) {
temp = target[j];
target[j] = target[j+1];
target[j+1] = temp;
}
}
}
for (int i = 0; i < target.length; i++) {
System.out.print(target[i] + " ");
}
}
}
バブルソートの時間計算量は次のとおりです。O(N²)
2.選択ソート
バブルソートが改善され、交換の数がO(N²)からO(N)に減り、比較の数は依然としてO(N²)です。安定したソートアルゴリズムではありません。
並べ替えるデータ要素から最小(または最大)の要素を選択するたびに、並べ替えるすべてのデータ要素が配置されるまで、シーケンスの最初に格納されます。
概要:配列内の前の要素と次の要素のサイズを比較します。次の要素が前の要素よりも小さい場合は、変数kを使用してその位置を記憶し、2番目の比較で前の「次の要素」が変化します。 「前の要素」になり、「次の要素」との比較を続けます。後者の要素が彼よりも小さい場合は、変数kを使用して配列内の位置(添え字)を記憶し、ループが終了するまで待ってから、交換新しい最小値と以前に選択した最小値。(Baidu百科事典)
実装:
public class SelectSort {
public static void main(String[] args) {
int[] target = {
1,7,6,4,5,2,9,4,6};
int temp = 0;
//暂存最小值的索引
int index;
for (int i = 0; i < target.length; i++) {
index = i;
for (int j = i+1; j < target.length; j++) {
if(target[index] > target[j]) {
index = j;
}
}
//交换
temp = target[index];
target[index] = target[i];
target[i] = temp;
}
for (int i = 0; i < target.length; i++) {
System.out.print(target[i] + " ");
}
}
}
ソートを選択する時間の複雑さは次のとおりです。O(N²)
3.挿入ソートソート
された順序データにデータを挿入し、番号に1を加えた新しい順序データを取得します。このアルゴリズムは、少量のデータをソートするのに適しています。安定したソート方法です。
挿入アルゴリズムは、並べ替えられる配列を2つの部分に分割します。最初の部分には最後の要素を除く配列のすべての要素が含まれ(配列に挿入用のスペースがもう1つあります)、2番目の部分にはこの要素のみが含まれます(挿入する要素)。最初の部分がソートされた後、この最後の要素をソートされた最初の部分に挿入します。
成し遂げる:
public class InsertSort {
public static void main(String[] args) {
int[] target = { 1, 7, 6, 4, 5, 2, 9, 4, 6 };
//暂存待插数据
int temp = 0;
//暂存待插数据下标
int index = 0;
//从第二个数开始,因为第一个可以看做有序
for (int i = 1; i < target.length; i++) {
temp = target[i];
index = i;
while (index > 0 && target[index-1] >= temp) {
target[index] = target[index - 1];
index--;
}
target[index] = temp;
}
for (int i = 0; i < target.length; i++) {
System.out.print(target[i] + " ");
}
}
}
挿入ソートの時間計算量はO(N²)ですが、データが基本的に順序付けまたは順序付けされている場合、挿入ソートの時間計算量はO(N)です。
これは、エントリ学習に適した比較的単純なソートアルゴリズムですが、後でより複雑なアルゴリズムがあります。
参照:Javaデータ構造とアルゴリズム(第2版)