一个新的排序算法及实现-双假设排序法

排序是数据处理中经常使用的一种重要运算,在《数据结构》教材中,排序是最后一章,是将数据结构理论用到生产实践中解决实际问题的一个示例。在排序中,会用到《数据结构》中线性表、队列、树等数据结构知识。在生产中,我们经常用到的是内排序,根据内排序是否基于关键字的比较,将内排序算法分为基于比较的排序算法和不基于比较的排序算法。像插入排序(直接插入排序、折半插入排序、表插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、树形选择排序、堆排序)、归并排序(二路归并排序)等都是基于比较的排序;而基数排序(计数排序、多关键字排序、链式基数排序、桶排序)是不基于比较的排序算法。
本文中所提到的一种新的排序算法应属于基于关键字比较的内排序算法范畴,但不同于以上列举的包括插入排序,交换排序,选择排序,归并排序的算法。

本文所提到的算法基于双假设思想:第一,假设当前待排序的元素是升序序列(也可是降序,但本例只讲升序场景);第二,假设此序列中第一个元素最小。
那么基于上述思想,先检测当前序列是否为升序,如果不为升序,则从升序序列后的第一个字符为基准值(序列中第1个元素也可假定为只含一个元素的升序序列,见图1),依次将此基准值与后面的元素相比较,将小于此基准值的放在它的左面,将大于此基准值的放在它的右面,然后都各自生成一个新的序列,分别为lArr和rArr,并统计各自的长度;并将之前升序的序列作为头部headArr,然后新的序列为headArr+lArr+rArr,然后按照上述的方法继续对新的序列进行重复操作……,直至将序列排序成升序序列。

在这里插入图片描述

经测试,本排序方法优于冒泡排序和选择排序,但落后于快速排序;目前此算法还在不断的优化中,现在先贡献出来,和学友们探讨。关于算法的名字我还没有想好,由于二次用到基础科学的假设理论,我暂且叫双假设排序法,如有不合适,择日再改。

代码见下:

在这里插入代码片
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;
    }
}

运行输出结果:
在这里插入图片描述
后记:我们学《数据结构》,学了冒泡、选择、快速等排序算法,我们不但要学会,学通,还要有创新的精神,并试着用学到的知识,创造一种新的排序算法,而不是只是简单学习前人创造的劳动成果,只有这样才能推陈出新,推动科技前进,这样才能真正学会东西,也才能学以致用。当前我们的学习和工作中一定要发扬创新精神。当前世界,俄乌战争的事实告诉我们,科学有国界,艺术有国界……如果没有创新精神,我们势必会受到各种掣肘和约束,只有创新,才能打破西方国家专利壁垒,让我国的科技逐渐走在当今世界的前列。正所谓条条大路通罗马,用专利以外的技术我们也可以实现我们的需求,这样可节省大量的专利费。愿我们的广大科技工作者在工作中发扬创新精神,为我国的科技进步做出大的贡献。

猜你喜欢

转载自blog.csdn.net/helloworldchina/article/details/123980426
今日推荐