`

四大排序

 
阅读更多

下面为工具方法,已封装成工具类,有兴趣的同学,可以复制过去,以备调用。

 

package org.tarena.liyunhua.utils;

import java.util.Arrays;
import java.util.Random;

public class SortUtil {
    /**
     * 冒泡排序,param参数,asc为升序,desc为降序
     * 
     * @param arr
     * @param param
     * @return
     */
    public static int[] maopao(int[] arr, String param) {
        int t;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1-i; j++) {
                if (param.equals("asc")) {
                    if (arr[j + 1] < arr[j]) {
                        t = arr[j + 1];
                        arr[j + 1] = arr[j];
                        arr[j] = t;
                    }
                } else if (param.equals("desc")) {
                    if (arr[j] < arr[j + 1]) {
                        t = arr[j + 1];
                        arr[j + 1] = arr[j];
                        arr[j] = t;
                    }
                }

            }
        }
        return arr;
    }

    /**
     * 冒泡排序,默认asc方式排序
     * 基本思路:相邻两个数,比较大小,升序,大的交换位置下沉。降序,小的交换位置也往下沉.
     * @param arr
     * @return
     */
    public static int[] maopao(int[] arr) {
        int t;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1-i; j++) {
                if (arr[j + 1] < arr[j]) {
                    t = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = t;
                }

            }
        }
        return arr;
    }

    /**
     * 插入排序,param参数,asc为升序,desc为降序
     */
    public static int[] insertSort(int[] arr, String param) {
        for (int i = 1; i < arr.length; i++) {
            int k = arr[i];
            int j;
            if ("asc".equals(param.toLowerCase())) {
                for (j = i - 1; j >= 0 && k < arr[j]; j--) {
                    arr[j + 1] = arr[j];
                }
                arr[j + 1] = k;
            } else if ("desc".equals(param.toLowerCase())) {
                for (j = i - 1; j >= 0 && k > arr[j]; j--) {
                    arr[j + 1] = arr[j];
                }
                arr[j + 1] = k;
            }

        }
        return arr;
    }
    
    /**
     * 插入排序,默认asc排序

    *基本思路:将要排序的数组分成两部分,每次从后面的数组部分中取出索引最小的数组元素,
    *插入到前面数组部分的适当位置中。通常用在开始排序时,将数组的第一个
    *元素作为一组,后面的所有元素被当成另一组。
     */
    public static int[] insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int k = arr[i];
            int j;
            for (j = i - 1; j >= 0 && k < arr[j]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = k;
        }
        return arr;
    }


    /**
     * 选择排 ,默认升序

    *基本思路:将要排序的数组分成两部分,一部分是从小到大已经排序好的,一部是无序的,
    *从无序的部分取出最小的数组,放到已经排好序的部分的最后。
     * @param args
     */
    public static int[] xuanze(int[] arr){
        int t;
        for(int i=0;i<arr.length;i++){
            int m=i;
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[m]){
                    m=j;
                }
            }
            if(i!=m){
                t=arr[i];
                arr[i]=arr[m];
                arr[m]=t;
            }
        }
        return arr;
    }


    /**
     * 选择排序 ,param参数,asc为升序,desc为降序
     * @param args
     */
    public static int[] xuanze(int[] arr,String param){
        int t;
        for(int i=0;i<arr.length;i++){
            int m=i;
            for(int j=i+1;j<arr.length;j++){
                if("asc".equals(param.toLowerCase())){
                    if(arr[j]<arr[m]){
                        m=j;
                    }
                }else if("desc".equals(param.toLowerCase())){
                    if(arr[j]>arr[m]){
                        m=j;
                    }
                }
                
            }
            if(i!=m){
                t=arr[i];
                arr[i]=arr[m];
                arr[m]=t;
            }
        }
        return arr;
    }


    /**
     * 产生一个length长度的随机数组,方法
     * @param length
     * @return
     */
    public static int[] randomArrays(int length){
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=new Random().nextInt(8888);
        }
        return arr;
    }

 

//快速排序,基本思路:将一个大的数组的排序问题,分解成2个小的数组的排序,而每个小的数组的排序,
//又可继续分解成更小的2个数组,这样一直递归分解下去,直到数组的大小最大为2。

 

//下面是用main进行测试
    public static void main(String[] args) {
        
        int[] arr=SortUtil.randomArrays(8888);
        //选择排序
        //System.out.println("选择排序随机数组为: "+Arrays.toString(arr));
        System.out.println("----------选择排序 开始----------");
        long start=System.currentTimeMillis();
        SortUtil.xuanze(arr);
        //System.out.println(Arrays.toString(arr));
        System.out.println("选择排序用时      "+(System.currentTimeMillis()-start)+"  毫秒");
        System.out.println("----------选择排序 结束----------");
        
        arr=SortUtil.randomArrays(8888);
        //插入排序
        //System.out.println("插入排序随机数组为: "+Arrays.toString(arr));
        System.out.println("----------插入排序 开始----------");
        start=System.currentTimeMillis();
        SortUtil.insertSort(arr);
        //System.out.println(Arrays.toString(arr));
        System.out.println("插入排序用时      "+(System.currentTimeMillis()-start)+"  毫秒");
        System.out.println("----------插入排序 结束----------");
        
        
        arr=SortUtil.randomArrays(8888);
        // 冒泡排序
        //System.out.println("冒泡排序随机数组为: "+Arrays.toString(arr));
        System.out.println("----------冒泡排序开始----------");
        start=System.currentTimeMillis();
        SortUtil.maopao(arr);
        //System.out.println(Arrays.toString(arr));
        System.out.println("冒泡排序 用时      "+(System.currentTimeMillis()-start)+"  毫秒");
        System.out.println("----------冒泡排序 结束----------");
        
        arr=SortUtil.randomArrays(8888);
        // 快速排序(Arrays.sort)
        //System.out.println("快速排序随机数组为: "+Arrays.toString(arr));
        System.out.println("----------快速排序 开始----------");
        start=System.currentTimeMillis();
        Arrays.sort(arr);
        //System.out.println(Arrays.toString(arr));
        System.out.println("快速排序 用时      "+(System.currentTimeMillis()-start)+"  毫秒");
        System.out.println("----------快速排序 结束----------");
    }
}

随机产生8888位数组,下面为测试结果

----------选择排序 开始----------
选择排序用时      94  毫秒
----------选择排序 结束----------


----------插入排序 开始----------
插入排序用时      47  毫秒
----------插入排序 结束----------


----------冒泡排序开始----------
冒泡排序 用时      203  毫秒
----------冒泡排序 结束----------


----------快速排序 开始----------
快速排序 用时      16  毫秒
----------快速排序 结束----------

总结:

快速排序,16毫秒,当之无愧第一名

插入排序,47毫秒 ,    排在第二名

选择排序,94毫秒,     排在第三名

冒泡排序,203毫秒,远远落最后名

分享到:
评论

相关推荐

    c++ 排序 代码大全:二分,四大排序

    文章包含了四大排序和二分查找,二分查找中还有单独的开根操作。我这个资源可以给那些还在学习排序的人使用,如果需要,请自取。

    JAVA四大排序介绍

    Java中的四大排序算法是编程基础中的重要组成部分,它们分别是插入排序、冒泡排序、选择排序和希尔排序。这些算法在不同的场景下各有优劣,理解并掌握它们有助于编写高效的程序。 1. 插入排序(Insertion Sort) ...

    java四大排序算法总结.zip

    本篇文章将详细探讨Java中冒泡排序、选择排序、快速排序以及插入排序这四大基本排序算法,并结合代码和动画演示来帮助理解它们的工作原理。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过重复遍历数组,...

    四大排序的动画演示 详细

    根据给定文件的信息,本文将详细介绍四种常见的排序算法——选择排序、冒泡排序、插入排序以及计数排序,并结合动画演示的方式,帮助读者更直观地理解这些算法的工作原理及其应用场景。 ### 一、选择排序 #### ...

    平时最常见的四大排序算法

    这里主要探讨四种常见的排序算法:冒泡排序、选择排序、插入排序以及快速排序。这些算法在C和C++编程中尤为常见,它们各自有不同的特点和适用场景。 1. **冒泡排序**: 冒泡排序是一种简单直观的排序方法。它通过...

    oj上题目的讲解,这里给大家总结了一下四大排序基本语法框架

    一题多解,知识脉络由浅到深,给人警醒,给新手小白了解四大升序排序方法的保姆式讲解和批注,附加图讲解,自己动手按照注释来演示一遍,马上就能学会!

    JAVA四种基本排序的总结

    本文将深入探讨四种基本的排序算法:冒泡排序、插入排序、选择排序和快速排序。这些算法各有特点,适用于不同的场景,理解它们的工作原理有助于提升编程能力。 首先,我们来了解冒泡排序(Bubble Sort)。冒泡排序...

    中山大学数据结构作业3四大基本排序的复杂度比较

    中山大学数据结构作业3四大基本排序的复杂度比较

    C++ 数据结构与算法 排序算法

    本文件将四大排序算法通过“「程序算法之排序」冒泡排序、插入排序、选择排序与快速排序”一文编写出,欢迎下载学习(文章链接:https://blog.csdn.net/Pomelo_ABC/article/details/126015013)

    常用的四种简单的排序算法

    【冒泡排序】 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这...

    python实现八大排序算法(2)

    本文主要介绍Python实现的四大排序算法:快速排序、堆排序、归并排序和基数排序。 1. **快速排序**: 快速排序是一种高效的排序算法,其平均时间复杂度为O(n log n),最坏情况下为O(n^2)。它的核心思想是分治法。...

    数据结构课程设计—排序问题

    整个设计被划分为四大模块:排序模块、排序性能比较模块、菜单模块和主函数模块。排序模块负责实施不同的排序算法;性能比较模块用于评估和对比不同排序算法的效率;菜单模块则提供了用户友好的交互界面;而主函数...

    基于C语言的数据结构中排序算法的分析研究 (1).pdf

    首先,根据排序方法的基本思想,可以将排序算法主要分为四大类:插入排序、选择排序、交换排序和归并排序。插入排序包括直接插入排序和希尔排序;选择排序涵盖直接选择排序和堆排序;交换排序则以冒泡排序和快速排序...

    java设计模式四大常用架构迭代模型并行排序算法.pdf

    Java 设计模式四大常用架构迭代模型并行排序算法 Java 设计模式是软件工程中的一种思想,旨在提高软件的重用性和可维护性。1995 年,著名的书籍《Design Pattern》出版,总结了 23 种经典的设计模式,成为软件设计...

    C语言输入-查询-输出-排序

    本教程将聚焦于C语言中的输入、查询、输出和排序四大核心概念,这对于初学者来说是非常重要的基础知识。 一、输入 在C语言中,我们通常使用标准输入库函数`scanf()`来获取用户输入。例如,如果我们要从用户那里获取...

    java设计模式_四大常用架构_迭代模型_并行排序算法

    ### Java设计模式与四大常用架构 #### 软件危机与设计模式的诞生 20世纪60年代的软件危机促使人们开始探索如何提高软件工程的质量和效率。最初,研究重点集中在数据结构和算法的选择上,但随着软件系统规模的不断...

    拓扑排序数据结构课程设计报告图形演示

    系统分为四大模块: 1. **有向图创建模块**:负责输入图的相关信息,并构建邻接表。 2. **拓扑排序模块**:调用拓扑排序算法进行排序。 3. **绘图模块**:用于绘制输入的有向图及其排序过程。 4. **拓扑排序核心...

    库函数,排序,数据类型与指针,三个PPT

    在编程世界中,库函数、排序、数据类型与指针是四大基础且至关重要的概念。这些知识点构成了程序设计的基础框架,对于任何级别的开发者来说,理解并熟练运用它们都是必要的。 首先,我们来看“库函数”。库函数是...

    数据结构中排序方法的研究.pdf

    排序的方法种类繁多,通常可以分为四大类:插入排序法、交换排序法、选择排序法和归并排序法。每一种排序方法都有其独特的算法思想和应用场景。 插入排序法包括直接插入排序和希尔排序。直接插入排序算法的核心在于...

Global site tag (gtag.js) - Google Analytics