新しいソートアルゴリズムとその実現 - 二重仮説ソート法

ソートは、データ処理でよく使用される重要な操作です. 「データ構造」の教科書では、ソートは最後の章です. これは、データ構造理論を生産実践に適用して実際の問題を解決する例です. ソートでは、「データ構造」の線形テーブル、キュー、ツリーなどのデータ構造の知識が使用されます。内部ソートがキーワード比較に基づいているかどうかによって、内部ソートアルゴリズムは比較ベースのソートアルゴリズムと非比較ベースのソートアルゴリズムに分けられます。挿入ソート(直接挿入ソート、半挿入ソート、テーブル挿入ソート、ヒルソート)、交換ソート(バブルソート、クイックソート)、選択ソート(単純選択ソート、ツリー選択ソート、ヒープソート)、マージソート(2-ウェイマージソート) などは比較に基づくソートですが、基数ソート (カウンティングソート、複数キーワードソート、連鎖基数ソート、バケットソート) は比較に基づかないソートアルゴリズムです。
この記事で言及されている新しい並べ替えアルゴリズムは、キーワード比較に基づく内部並べ替えアルゴリズムのカテゴリに属する​​はずですが、挿入並べ替え、交換並べ替え、選択並べ替え、マージ並べ替えなど、上記のアルゴリズムとは異なります。

この記事で言及されているアルゴリズムは、二重の仮定に基づいています: まず、現在ソートされている要素が昇順 (または降順。ただし、この例では昇順のシナリオのみを説明しています) であると仮定します。次に、この最初の要素がこのシーケンスは最小です。
次に、上記の考え方に基づいて、まず現在のシーケンスが昇順であるかどうかを確認し、そうでない場合は、昇順シーケンスの後の最初の文字が基準値です (シーケンスの最初の要素は、次を含む昇順シーケンスであると見なすこともできます)このベンチマーク値を次の要素と順番に比較し、このベンチマーク値よりも小さいものを左側に、このベンチマーク値よりも大きいものを右側に置き、次にそれぞれ lArr と rArr の新しいシーケンスを生成し、それぞれの長さを数えます; 前の昇順のシーケンスを先頭の headArr として使用し、新しいシーケンスは headArr+lArr+rArr であり、その後、上記の方法...、シーケンスが昇順にソートされるまで。

ここに画像の説明を挿入

テスト後、このソート方法はバブル ソートや選択ソートよりも優れていますが、クイック ソートには遅れをとっています.現在、このアルゴリズムはまだ最適化されているため、最初に貢献し、仲間の学生と議論します. アルゴリズムの名前はまだ決めていません.基礎科学的仮説理論の2回目の使用以来、当分の間、二重仮説ソート法と呼びます.適切でない場合は、後で変更します.

以下のコードを参照してください。

在这里插入代码片
package numbersort.src.main.java;

import java.util.HashMap;
import java.util.Map;

public class SupposeSort {
    
    
    public static void main(String[] args) {
    
    

        int array[]={
    
    -74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,
                28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,
                -72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,
                14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,
                45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,
                92,52,-45,-2,85,-63,56,55,12,-85,77,-39};
        supposeSort(array);
    }
    public static void supposeSort(int nums[]) {
    
    
        int m = 0; //用于统计循环次数
        int length = nums.length;
        int headArr[]=new int[nums.length];
        int headNum=0;
        int lArr[] = new int[nums.length];

        int rArr[] = new int[nums.length];

        int temp = 0;
        int address = 0;
        int index = 0;
        int iwhile = 1;
        while (iwhile < 100) {
    
    
            Map<String, Integer> map=new HashMap<String, Integer>();
            map=isAscReturnVar(nums);
            int asc=map.get("asc");
            index=map.get("indexInte");
            if (asc==1) {
    
    
                break;
            }
            //假设第一个值最小
            for (int i = index; i < nums.length; i++) {
    
    
                System.out.println("index:" + index);
                int lNum = 0;
                int rNum = 0;
                for (int j = 1 + i; j < nums.length; j++) {
    
    
                    m++;
                    System.out.println("循环次数为:" + m);
                    if (nums[i] <= nums[j]) {
    
    
                        rArr[rNum] = nums[j];
                        rNum++;
                    } else {
    
    
                        lArr[lNum] = nums[j];
                        lNum++;
                    }
                    temp = nums[i];
                } //j

                System.out.println("i="+i);
                System.out.println("当前基准值是nums["+i+"]="+temp);
                address=lNum;
                if (address==0) {
    
    
                    headArr[i]=nums[i];
                    nums=headArr.clone();
                }

                if (lNum > 0) {
    
    

                    for (int p = 0; p < lNum; p++) {
    
    
                        nums[p+i] = lArr[p];
                    }

                }
                nums[lNum+i] = temp;

                if ((lNum==0)&&(rNum==0)) {
    
    
                    iwhile = 1000;
                    headArr[i]=nums[i];
                    index++;
                    System.out.println("iwhile:"+iwhile);
                    break;
                }

                if ((rNum > 0) && (rNum <= (length - 1))) {
    
    
                    for (int q = 0; q < rNum; q++) {
    
    
                        nums[lNum + 1 + q+i] = rArr[q];
                    }
                }
                //打印
                System.out.println("开始打印");
                System.out.println("lNum:"+lNum);
                System.out.println("headArr:");
                for (int t = 0; t < headArr.length; t++) {
    
    
                    System.out.print("*");
                    System.out.print(headArr[t]);
                }
                System.out.println("");
                System.out.println("----------------------------------");

                System.out.println("lArr:");
                for (int t = 0; t < lArr.length; t++) {
    
    
                    System.out.print("*");
                    System.out.print(lArr[t]);
                }
                System.out.println("");
                System.out.println("----------------------------------");
                System.out.println("rNum:"+rNum);
                System.out.println("rArr:");
                for (int t = 0; t < rArr.length; t++) {
    
    
                    System.out.print("*");
                    System.out.print(rArr[t]);
                }
                System.out.println("");
                System.out.println("----------------------------------");

                System.out.println("nums:");
                for (int t = 0; t < nums.length; t++) {
    
    
                    System.out.print("*");
                    System.out.print(nums[t]);
                }
                System.out.println("");
                System.out.println("----------------------------------");

                if (lNum>=2) {
    
    
                    if (isAsc(lArr,lNum+1)) {
    
    
                        index=index+lNum+2;
                        System.out.println("index:"+index);
                        break;
                    }
                }

                address = lNum;


                if (lNum > 0) {
    
    
                    lNum = 0;
                    rNum = 0;
                }
                if (address==0) {
    
    
                    continue;
                }

                if (rNum == (length - 1)) {
    
    
                    break;
                }
                if (address > 0) {
    
    
                    break;
                }
            } // i
        }//while
    }

    public static Map<String, Integer> isAscReturnVar(int nums[]) {
    
    
        int n=0; //用于统计循环次数
        int index=0;//用于for循环的起始位置
        Integer asc=1;
        for( int i = 0;i < nums.length-1 ; i++ ){
    
    
            n++;
            if(nums[i] > nums[i+1]) {
    
    
                index=i;
                asc=0;
                break;
            }
        }
        if (asc.equals(1)) {
    
    
            System.out.println("nums is 递增序列");
            for( int i = 0;i < nums.length ; i++ ){
    
    
                System.out.print(" * ");
                System.out.print(nums[i]);
            }
            System.out.println(" ");
        }
        Map<String, Integer> map=new HashMap<String, Integer>();
        map.put("asc",asc);
        Integer indexInte=new Integer(index);
        map.put("indexInte",indexInte);
        return map;
    }
    public static boolean isAsc(int nums[]) {
    
    
        int n=0; //用于统计循环次数
        boolean asc=true;
        for( int i = 0;i < nums.length-1 ; i++ ){
    
    
            n++;
            if(nums[i] > nums[i+1]) {
    
    
                asc=false;
            }
        }
        if (asc) {
    
    
            System.out.println("nums is 递增序列");
            for( int i = 0;i < nums.length ; i++ ){
    
    
                System.out.print(" * ");
                System.out.print(nums[i]);
            }
            System.out.println(" ");
        }
        return asc;
    }

    public static boolean isAsc(int nums[],int length) {
    
    
        int n=0; //用于统计循环次数
        boolean asc=true;
        for( int i = 0;i < length-1 ; i++ ){
    
    
            n++;
            if(nums[i] > nums[i+1]) {
    
    
                asc=false;
            }
        }
        if (asc) {
    
    
            System.out.println("Nums is 递增序列");
            for( int i = 0;i < length-1 ; i++ ){
    
    
                System.out.print(" # ");
                System.out.print(nums[i]);
            }
            System.out.println(" ");
        }
        return asc;
    }
}

出力結果の実行:
ここに画像の説明を挿入
追記: 「データ構造」を学び、バブリング、選択、高速化などの並べ替えアルゴリズムを学習しました.新しい並べ替えアルゴリズムは、先人が作成した労力の成果を単に学習するのではなく、この方法でのみ革新し、テクノロジーの進歩を促進し、実際に物事を学び、学んだことを適用できるようにします。現在、私たちは研究と仕事において革新の精神を引き継がなければなりません。現在の世界では、ロシアとウクライナの戦争の事実は、科学には国境があり、芸術には国境があることを教えてくれます...革新的な精神がなければ、私たちはさまざまな制約と制約にさらされることになります。西側諸国の特許障壁を破り、わが国の技術を徐々に今日の世界の最前線に立たせることができます。ことわざにあるように、すべての道はローマに通ず、特許以外の技術でもニーズを実現できるため、特許料を大幅に節約できます。わが国の膨大な数の科学技術関係者が自らの仕事において革新の精神を持ち続け、わが国の科学技術の進歩に大きく貢献することを願っています。

Supongo que te gusta

Origin blog.csdn.net/helloworldchina/article/details/123980426
Recomendado
Clasificación