バブルソート
主なアイデア:最初に1つずつ比較し、最大のものを後ろに置き、最後の値が各トラバーサル中に最大になるようにします。
public static void bubbleSort(int[] arr){
//冒泡排序
int len=arr.length;
for(int i=1;i<len;i++){
for(int j=0;j<len-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
挿入ソート
主なアイデア:ソートされていない要素を1つずつソートされたものに挿入します。
次の要素nが取得されるたびに、先頭の0からn-1までの要素がソートされます。必要なのは、ソートされた要素にnを挿入することです。序文の中
public static void insertSort(int[] array){
//插入排序
int i,j,temp;
for(i=1;i<array.length;i++) {
temp=array[i];
for(j=i-1;j>=0;j--) {
if(temp>array[j]) {
break;
}else {
array[j+1]=array[j];
}
}
array[j+1]=temp;
}
}
ソートを選択
主なアイデア:iが最小値の添え字であるたびに、次の要素をループして(前のi-1要素が並べ替えられているため)、残りの要素の最小添え字を見つけて、現在のiと最小値の添え字が交換されますが、これは不安定です。
public static void selectSort(int[] arr){
//选择排序
for(int i = 0; i < arr.length-1; i++){
int min = i;
for(int j = i+1; j <arr.length;j++){
if(arr[j]<arr[min]){
min = j;
}
}
if(min!=i){
swap(arr, i, min);
}
}
}
クイックソート(分割統治)
主なアイデアは、簡単に言えば、基本的な値のベースを自由に設定し、左側のベースよりも小さいものと右側のベースを配置することです。2つの部分は、を使用して2つの部分に分割されます。同じ考えで、新しいベースを取り出し、左側に小さいものを、右側に大きいものを置き、最後に置くと、ソートされます。
重要な点は、左右のダブルカーソル、left ++、right–を使用して配列をすばやく並べ替え、すべての要素をトラバースして、小さい要素を左に、大きい要素を右に配置できるようにすることです。具体的な実装のレビュー、リファレンスコード、独自の手書きを書いて、各レビューをすばやく覚えてください。
public static void quikSort(int[] arr,int left,int right){
//快速排序(分治思想)
if(right<=left)return;
int k=part(arr,left,right);
quikSort(arr,left,k-1);
quikSort(arr,k+1,right);
}
private static int part(int[] arr, int left, int right) {
int base=arr[left];
while (left<right){
//右边开始
for(;arr[right]>base&&right>left;right--);
if(right>left){
arr[left]=arr[right];
left++;
}
//左边
for(;arr[left]<base&&right>left;left++);
if(left<right){
arr[right]=arr[left];
right--;
}
}
arr[left]=base;
return left;
}
マージソート
主なアイデアは、分離できないまで2つに分割し続け、マージを開始することです。各マージでは、新しい配列tempを使用して、マージおよびソートされたアイテムを格納し、要素グループにtempを割り当てます。マージされた段落、次に段落段落の割り当てにより、ソートは成功します。
コードの主な理解は、マージ時に配列aが分解されないが、2つに分割され、次に(low、mid)(mid + 1、high)を使用して2つの段落に分割され、理解することです。 i = lowとj = mid + 1にカーソルを2つ入れ、aの要素を比較してから、Tempに割り当て、短いセクションをマージします。一般的には成功しました(理解してください!!!)
public static int[] sort(int[] a,int low,int high){
int mid = (low+high)/2;
if(low<high){
sort(a,low,mid);
sort(a,mid+1,high);
//左右归并
merge(a,low,mid,high);
}
return a;
}
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while(j<=high){
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
ヒープソート
主なアイデアは、最初に二分木の基本的な定義を理解する
parent(i)=(i-1)/ 2
left_child(i)= 2 i + 1
right_child(i)= 2 i +1;これらを理解していない場合3つ目は、読み取る必要がない
ことです。推定プロパティ:
最後のリーフノード(子ノードはリーフノードと呼ばれません)のインデックスはarr.length-1です。
最後の非リーフノードのインデックスは(arr.lenght-1-1)/ 2
です
。アルゴリズムアニメーションを最初に見てください:http://www.cs.usfca.edu/~galles/visualization/HeapSort.html
残りアルゴリズムリファレンス:
https://blog.csdn.net/nrsc272420199/article/details/82559912
は非常に詳細で、理解しやすいです。
一般的に
言えば、それは3つのポイントにすぎません。1。ヒープ化とも呼ばれる大きなルートヒープ(親ノードは左右の子ノードよりも大きい)の配列で構成されるバイナリツリーを構築します。2
。ヘッドツリーのノードは最大数であり、ヒープの上部と下部の数(最後の桁)交換位置
3.手順を繰り返して、現在の最大値を右から左に段階的に配置します。
問題点、ビッグルートパイルの原理とアルゴリズムの実装については、上記のブログを参照してください。書き込みは素晴らしいです。