概要:8ソートアルゴリズム

ディレクトリ

まず、挿入ソート

1、直接挿入ソート

 

2、ヒルソート

 

第二に、選択ソート

1、簡単な選択ソート

 

2、ヒープソート

 

第三に、交換ソート

1、バブルソート

 

2、クイックソート

 

第四に、マージソート


まず、挿入ソート

1、直接挿入ソート

第一種の第一の部分が完了し、その後、挿入、二つの部分に分割するソート配列、(挿入される要素を除く)配列のすべての要素、他の部分は、要素を挿入すること:考えアルゴリズムであります要素第1の部分はによって実行二つの部分に再分割である。ソート。

ここでデフォルトARR [0]の配列部分、ARR [J] = ARR [J - 1]排出され、数が後方から前方へトラバースの数よりも小さい場合には、後方に移動し、その後、ソートされる電流を表します[J] = TEMPをARR、挿入位置に対応する値を表しています。

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
int gap = 1,i,j;
int temp;
int len = arr.length;
for(i = 1;i < len;i++){
    temp = arr[i];
    for(j = i;j >= 1&&arr[j - 1] > temp;j -= 1){
        arr[j] = arr[j - 1];
    }
    arr[j] = temp;
}

平均時間の複雑さ

ベストケース

最悪の場合

宇宙複雑

O(n²)

O(N)

O(n²)

O(1)

 

2、ヒルソート

バイナリ各ギャップは、その後減少し、上述の動作サイクル;その後、各グループの要素は、ソートの直接挿入ソートの方法を用いて、以下の工程におけるソートパケットギャップなるように配列ギャップ= 1、直接挿入を使用して、完全なソート。

実際に、直接挿入ソートステップが示さヒル選別工程は、ギャップになった2つの値1を比較することです。これは、直接挿入ソートの最適化です。

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};

int gap = 1,i,j;
int temp;
int len = arr.length;
while(gap < len /3){
    gap = gap * 3 + 1;
}
for(;gap > 0; gap /= 3){
    for(i = gap ; i < len;i++){
        temp = arr[i];
        for(j = i;j >= gap && arr[j - gap]> temp;j -= gap){
            arr[j] = arr[j - gap];
        }
        arr[j] = temp;
    }
}

 

平均時間の複雑さ

ベストケース

最悪の場合

宇宙複雑

O(nlog2 N)

O(nlog2 N)

O(nlog2 N)

O(1)

 

第二に、選択ソート

1、簡単な選択ソート

このアルゴリズムは比較的単純で、最も小さい値を毎回見つけ、その後、彼の前の最初の添え字1,2 ..... arr.length-1交換を保存することです。

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
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[i]){
            min = j;
        }
    }
    if(min != i){
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

O(n²)

O(n²)

O(n²)

O(1)

 

2、ヒープソート

トップは大きなヒープで山にすべての最初の配列の最初の。そして、それぞれが大きなトップ杭先頭の要素を取って横断、再びheapify。完全なシーケンシング。

public static void main(String[] args) {
//        int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
        int[] arr = {2,5,3,1,10,4};
        heap_sort(arr,arr.length);
        for(int k = 0;k < arr.length;k++){
            System.out.print(arr[k] + " ");
        }

    }
    //通过堆排序,输出
    public static void heap_sort(int[] arr,int len){
        build_heapify(arr,len);
        for(int i = len - 1;i >= 0; i--){
            swap(arr,i,0);
            heapify(arr,i,0);
        }
    }
    //构建整个堆,每一个堆节点
    public static void build_heapify(int[] arr,int len){
        int last_node_index = len - 1;
        int parent_index = (last_node_index - 1) / 2;
        for(int i  = parent_index;i >= 0;i--){
            heapify(arr,len,i);
        }
    }
    //对单个堆进行排序
    public static void heapify(int []arr,int len,int i){
        if(i >= len)
            return ;
        int left = i * 2 + 1;
        int right = i * 2 + 2;
        int max = i;
        if(left < len && arr[max] < arr[left])
            max = left;
        if(right < len &&arr[max] < arr[right])
            max = right;
        if(max != i){
            swap(arr,max,i);
            heapify(arr,len,max);
        }
    }
    public static void swap(int[] arr,int x,int y){
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }

平均時間の複雑さ

ベストケース

最悪の場合

宇宙複雑

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(1)

 

第三に、交換ソート

1、バブルソート

このアルゴリズムは、最後の位置にバブリング比較的単純な、直接の最大値です。

for(int i = arr.length;i >= 0;i--){
    for(int j = 0;j < i&& j + 1 < i;j++){
        if (arr[j] > arr[j + 1]){
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

平均時間の複雑さ

ベストケース

最悪の場合

宇宙複雑

O(n²)

O(N)

O(n²)

O(1)

 

2、クイックソート

クイックソートバブルソートこのアイデアの最適化をすることです:基準値を選択し、基準値の左側には、その右側にその値より大きい未満です。

public static void quick_sort(int[] arr ,int low,int high){
    if(arr.length < 0 || low > high)
        return ;
    int left = low;
    int right = high;
    //保存基准值
    int temp = arr[left];
    while(left < right){
        //从后向前找到比基准小的元素
        while(left < right && arr[right] >= temp){
            right--;
        }
        arr[left] = arr[right];
        //从前往后找到比基准大的元素
        while(left < right && arr[left] <= temp){
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = temp;
    quick_sort(arr,low,left - 1);
    quick_sort(arr,left + 1,high);
}

O(nlog₂n)

O(nlog₂n)

O(n²)

(再帰バージョンを区画する代わりに)O(1)

 

第四に、マージソート

思想:

。①隣り合うシーケンス番号は、操作、床(N / 2)配列、2つのソート要素を含む各シーケンスをマージします。

。②上記のシーケンスが再び形成するためにマージ(N / 4)床配列は、4つの要素を含む各配列。

③。繰り返しステップは②、すべての要素がソートされるまで。

 

public static int[] mergingSort(int[] arr){
    if(arr.length <= 1)
        return arr;
    int num = arr.length >> 1;
    int[] arrLeft = Arrays.copyOfRange(arr,0,num);
    int[] arrRight = Arrays.copyOfRange(arr,num,arr.length);
    return mergeTwoArray(mergingSort(arrLeft),mergingSort(arrRight));
}

public static int[] mergeTwoArray(int[] arr1,int[] arr2){
    int[] result = new int[arr1.length + arr2.length];
    int i = 0,j = 0, k = 0;
    while(i < arr1.length && j < arr2.length){
        if(arr1[i] < arr2[j]){
            result[k++] = arr1[i++];
        }else{
            result[k++] = arr2[j++];
        }
    }
    while(i < arr1.length){
        result[k++] = arr1[i++];
    }
    while(j < arr2.length){
        result[k++] = arr2[j++];
    }
    return result;
}

第五に、基数ソート

思考のバケットソートの使用

public static void radixSort(int[] arrays){
    int max = findMax(arrays);

    //遍历位数
    for(int i = 1;max / i > 0;i *= 10){
        int[][] buckets = new int[arrays.length][10];
        //获取每一位数字(个、十、百、千位...分配到桶子里)
        for(int j = 0;j < arrays.length;j++){
            int num = (arrays[j] / i) % 10;
            //将其放入桶子里
            buckets[j][num] = arrays[j];
        }
        //回收桶子里的元素
        int k = 0;

        for(int j = 0;j < 10;j++){
            for(int y = 0;y < arrays.length;y++){
                if(buckets[y][j]!=0){
                    arrays[k++] = buckets[y][j];
                }
            }
        }
    }
}

public static int findMax(int[] arrays){
    int max = 0;
    for(int i = 0;i < arrays.length;i++){
        if(arrays[i] > max){
            max =arrays[i];
        }
    }
    return max;
}

 

发布了134 篇原创文章 · 获赞 91 · 访问量 16万+

おすすめ

転載: blog.csdn.net/weixin_44588495/article/details/104082500