首页 > 编程语言 > 排序算法值鸡尾酒排序(java)

排序算法值鸡尾酒排序(java)

时间:2023-12-01 20:32:00浏览次数:46  
标签:java 鸡尾酒 int 元素 array 排序 isSorted

一:概述

冒泡排序的每一个元素都可以像小气泡一样,根据自身的大小,一点一点地向着数组的一侧移动。算法的每一轮都是从左到右比较元素,进行单向的位置交换的

鸡尾酒排序做了怎样的优化:

鸡尾酒排序的元素比较和交换过程是双向的。

二:举例子

由9个数字组成的无序数列{2, 3, 4, 5, 6, 7, 1, 9, 8},对其我们希望从小到大的排序。

如果按照冒泡排序的思想,排序过程如下。

                                   排序算法值鸡尾酒排序(java)_鸡尾酒排序

元素2,3,4,5,6,7,8,9都已经是有序的了,只有元素1的位置不对,却还要进行第8轮排序。

鸡尾酒排序就是解决这种问题的。

下面来说一说这个鸡尾酒排序的具体内容:

第一轮(和冒泡排序一样,8和9交换)

                                   排序算法值鸡尾酒排序(java)_鸡尾酒排序_02

第二轮

此时开始不一样了,我们反过来从右向左比较进行交换。

                                   排序算法值鸡尾酒排序(java)_冒泡排序_03

                                   排序算法值鸡尾酒排序(java)_赋值_04

第三轮(虽然实际上已经有序了,但是流程并没有结束)

在鸡尾酒排序的第三轮,需要重新从左向右比较进行交换。

1和2比较位置不变,2和3比较位置不变吗,3和4比较位置不变........6和7比较位置不变,7和8比较位置不变,8和9比较位置不变。

没有元素位置进行交换,证明已经有序,排序结束。

这就是鸡尾酒排序的思路。排序过程就像钟摆一样,第一轮从左向右,第2轮从右向左,第3轮从左向右....

鸡尾酒排序的代码实现如下:

 public static void sort(int array[]) {
        // 定义一个临时变量
        int tmp = 0;
        for (int i = 0; i < array.length / 2; i++) {
            // 有序标记,每一轮的初始值都是true
            boolean isSorted = true;
            // 奇数轮,从左向右比较和交换
            for (int j = i; j < array.length - i - 1; j++) {
                // 如果左边的元素大于右边的元素,则将该左边的元素赋值给临时变量
                if (array[j] > array[j + 1]) {
                    tmp = array[j];
                    // 再将右边的值赋值给左边的元素
                    array[j] = array[j + 1];
                    // 最后将临时变量的值,即左边元素的值赋值给右边的元素,达到交换值目的
                    array[j + 1] = tmp;
                    // 有元素交换,所以不是有序的,标记变为false
                    isSorted = false;
                }
            }
            // 如果是true就跳出整个循环
            if (isSorted) {
                break;
            }

            // 在偶数轮之前,将isSorted重新标记为true
            isSorted = true;
            // 偶数轮,从右向左比较和交换
            for (int j = array.length - i - 1; j > i; j--) {
                if (array[j] < array[j - 1]) {
                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;
                    // 因为有元素交换,所以不是有序的,标记变为false
                    isSorted = false;
                }
                if (isSorted) {
                    break;
                }
            }
        }





    }


    public static void main(String[] args) {
        int[] array = new int[]{2, 3, 4, 5, 6, 7, 1, 9, 8};
//        int[] array = new int[]{2, 3, 4, 5, 6, 7,8, 1};
        sort(array);
        System.out.println(Arrays.toString(array));


    }


}

这段代码是鸡尾酒的原始实现。代码外层的大循环控制着所有的排序回合,大循环内包含两个小循环,第一个循环从左向右比较,第二个循环,从右向左比较元素并交换元素。

标签:java,鸡尾酒,int,元素,array,排序,isSorted
From: https://blog.51cto.com/u_15912723/8648941

相关文章

  • java Runtime
    packagenet.elaina.Runtime;importjava.io.IOException;publicclasstest1{publicstaticvoidmain(String[]args)throwsIOException{/*publicstaticRuntimegetRuntime()当前系统的运行环境对象publicvoidexit(......
  • Java设计模式-策略模式详解
    1.策略模式基本了解策略模式(StrategyPattern)是一种行为型设计模式,它定义了一组可以相互替换的算法,使得客户端可以根据不同的需求选择不同的算法,将对象和行为分开。在策略模式中,我们创建了一个策略接口,该接口定义了所有必需的方法。然后,我们创建了实现了该策略接口的具体策略......
  • java~将多个输出流压缩成一个zip文件
    hutool工具包可以帮我们完成这件事,几行代码可以实现,我们提供两种方式,压缩本地文件和压缩内存流。压缩本地文件@Testpublicvoidzip(){StringentryName="d:\\codegen\\1";StringzipFilePath="d:\\codegen\\example.zip";//将entryName这个文件或者目录,......
  • Java环境变量配置及报错java --version Error: could not open `D:\APP\Develop\JA
    C:\Users\Administrator>java--versionError:couldnotopen`D:\APP\Develop\JAVA\jre\lib\amd64\jvm.cfg'Java环境变量的配置控制面板→系统→高级系统设置→环境变量在下方系统变量中新建在下方系统变量中找到Path,双击打开,新建两个%JAVA_HOME%\bin%JAVA_HOME%\jre\b......
  • java heap space解决方法
    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的Heapsize不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError:Javaheapspace。所以产生这个异样的原因通常有两种:1.程序中出现了死循环2.程序占用内存太多,超过了JVM堆设置的最大值。对于第一种情况,需要自......
  • Java对接阿里云短信模块
    1.去阿里云申请短信签名,申请签名需要网站域名,注意申请,下来的就是签名主体2.申请签名模板拿到签名模板CODE3.RAM开通账号,并且权限要去找到那个短信服务的权限,配置给用户,可以拿到key和sercet4.开始java代码publicstaticfinalStringproduct="Dysmsapi";//产品域名,开发......
  • Java继承与多态:实现代码复用与扩展的利器
    一、概述在Java编程语言中,继承和多态是两个非常重要的概念,它们是实现代码复用、扩展性和灵活性的关键。本文将详细介绍Java继承和多态的概念、实现方法以及注意事项,帮助您更好地理解和应用这两种技术。二、Java继承继承的概念Java继承是面向对象编程中的一个基本概念,它允许我们基于......
  • java使用http工具类调用第三方接口
    java使用http工具类调用第三方接口一、所需maven依赖:<!--json依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version>......
  • 复习:Java基础-泛型方法
    泛型大家都很熟悉了泛型方法呢可能很多小伙伴都有混淆,今天来稍微复习一下泛型方法(普通方法)publicclassTest<T>{publicTf(Tc){//注意声明,使此方法成为泛型方法returnc;}}泛型方法(静态方法)这么写编译就通过不了错误写法publicclassTe......
  • android开发aar包或者jar包出现类重复问题Caused by: java.lang.RuntimeException: Du
    如果是仓库依赖的方式直接使用exclude语句移除相同的依赖库即可,如下:implementation("org.java-websocket:Java-WebSocket:1.5.2"){excludegroup:'org.slf4j',module:'slf4j-api'//exclude掉websocket库依赖的slf4j库}但是如果是aar包或者jar包里面的类重复呢?这个......