一般的に使用されるいくつかのアルゴリズムを要約します(java)

ここに画像の説明を挿入

バブルソート

主なアイデア:最初に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.手順を繰り返して、現在の最大値を右から左に段階的に配置します。
問題点、ビッグルートパイルの原理とアルゴリズムの実装については、上記のブログを参照してください。書き込みは素晴らしいです。

おすすめ

転載: blog.csdn.net/weixin_43722571/article/details/99566034