基本的なアルゴリズム:バブルソート

基本的なアルゴリズム:バブルソート

アルゴリズムバブルの紹介

バブルアルゴリズム(バブルソート)は、比較的単純なソートアルゴリズムです。ある論理ソーティング順次隣接する二つの要素を比較するアクセス繰り返してソートする列要素を順(ZにAから例えば、降順最初の文字)が正しくない場合、それは要素の位置を交換し、繰り返しノー隣接する要素までのプロセスは、交換する必要があります。
気泡がそのバブルアルゴリズムの名前、列の一番上にゆっくりと浮くようなアルゴリズムの名称ソートした後、小さな要素は交流を通過するアルゴリズムのでは次のようになります。

詳細なソートアルゴリズム

[1,6,3,5,2]の配列があると仮定し、小規模から大規模まで私たちが使用する方法は、バブルソートを行います。

最初の旅行の並び替え:

  1. 1〜6と比較して、6が同一の位置、1未満です。[1,6,3,5,2]
  2. 6 3と比較して、6が交換位置、3よりも大きいです。[1,3,6,5,2]
  3. 6 5と比較して、6が交換位置、5よりも大きいです。[1,3,5,6,2]
  4. 6 2と比較して、6が交換位置、2よりも大きいです。[1,3,5,2,6]

第二のトリップ並び替え:

  1. 1〜3と比較して、同じ位置、3未満です。[1,3,5,2,6]
  2. 図3は、5と比較して、図3は、5未満、同じ位置です。[1,3,5,2,6]
  3. 5 2と比較して、5が交換位置、2よりも大きいです。[1,3,2,5,6]

第三のトリップ並び替え:

  1. 1〜3と比較して、同じ位置、3未満です。[1,3,2,5,6]
  2. 3 2と比べて、図3は、交換位置、2よりも大きいです。[1,2,3,5,6-]

分析

  • 各旅行ソートバブルソート、比較が少ないデータになります。各ソート大きなは、シフト後のインデックスであろう第一のトリップ行が並べ替え、最大値を見つけること、第二のパスは、二番目に大きい値をソートするため。最後に比較、我々は少なく、データを比較する必要があります。バブルソートの対象となるN個のデータ長、N-1回をソートする(各旅行のデータ比較が少なくなるため)、i番目の負の回数は、Ni-1倍です。

複雑性分析

のは、次のバブルソートの時間計算量と空間の複雑さを分析してみましょう。

時間計算:

  • 最良のシナリオ:データ自体はすでにソートされ、その後、ノー要素交換。唯一のn-1回の完全なソートに、時間計算量はO(N)です。
  • 最悪のケース:私たちはすべてを一度に再注文に持っているので、データは、逆の順序です。/ 2 = O(N ^ 2) - nビットの列数は、比較的(N-1)+(N-2)+ ... + 1 = N *(1〜N)の数です。
  • 平均複雑:O(N ^ 2)

宇宙複雑:アルゴリズムによって消費されるストレージ容量。

  • 最高:データ自体が秩序あると、一時的な変数を使用しない、複雑さは0です。
  • 最悪の場合:逆の順序でソートされたデータは、それぞれが一時変数を使用します。複雑さはO(N)です。
  • 平均複雑:O(1)。

Javaコードの実装

package top.enjoyitlife.bubble;

import java.util.Arrays;

/***
* @ClassName: BubbleAlgorithm 
* @Description: 冒泡排序算法
* @author MegaSlark 
 */
public class BubbleAlgorithm {
    public static void main(String[] args) {
        int[] nums=new int[] {1,2,3,6,7};
        BubbleAlgorithm ba = new BubbleAlgorithm();
        ba.bubbleSort(nums);
        System.out.println(Arrays.toString(nums));
    }

    /****
     * 冒泡排序 正序 有小到大
     * @param nums
     */
    public void bubbleSort(int[] nums) {
        if(null==nums||nums.length<1) {
            return;
        }
        int length=nums.length;
        //数组下标从0开始,比较趟数为数组长度减1
        for(int i=0;i<length-1;i++) {
            //是否需要全部循环标识
            boolean flag=true;
            //length-1的原因同上,多减i是因为不需要比较的数据为i个。每次冒泡都会找出一个不许要再次比较的数。
            for( int j=0;j<length-1-i;j++) {
                // 控制冒泡方向 倒序还是正序
                int temp=0;
                if(nums[j]  >  nums[j+1]) {
                    temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                    flag=false;
                }
            }
            if(flag) {
                break;
            }
            
        }
    }
}

これらは、受け入れられ、コード例バブルソート、私はあなたの助けを期待しています。

おすすめ

転載: www.cnblogs.com/enjoyitlife/p/12002496.html