java数据结构:排序算法(1)

【数据结构排序算法系列】数据结构八大排序算法 排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将对数据结构中常见的八大排序算法进行详细的讲解。 写在前面的话:首先要明白在学习同类型的排序算法时,一定要明白任何相同领域存在的东西一定是竞争之后的结果,所以对于相同类型的排序之所以能够存在多种被人熟 阅读详情
package com.sort;


//本节学习几种常见的排序方式:
/*1.排序简介:
 *  排序可以分为内部排序和外部排序,
 * 2.内部排序:(只使用内存进行排序)
 *      2.1插入排序:
 *          直接插入排序;
 *          希尔排序;
 *      2.2交换排序:
 *          冒泡法排序
 *          快速排序
 *      2.3选择排序
 *          简单选择排序
 *          堆排序
 *      2.4 基数排序
 *      2.5 归并排序
 *      2.6桶排序
 * ----由于对树没有一个全面的体系,在此把 2.3-2.6的内容作为下一次学习的内容---
 * */

//2.1直接插入排序;
//参考文献: http://developer.51cto.com/art/201206/345156.htm
class InsertSort {
    /*直接插入排序的基本思想:(从小到大)
     * 把待排序的记录按其关键字的大小逐个插入到一个已经排好序的有序序列中,直到
     * 所有的记录插入完成为止,得到一个新的有序序列;
     * 第一步:
     *      从第一个元素开始,该元素可以认为已经被排序;
     * 第二步:
     *      取出下一个元素,在已经排序的元素序列中  从后向前  扫描比较;
     * 第三步:  
     *      如果该元素(已排序)大于新元素,将该元素移到下一位置
     * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置  将新元素插入到该位置中  
     * 重复步骤2至到结束;
     * 
     * 性能分析:
     * 为了正确的插入第i个记录,最多要比较i次,最少比较1次,那么平均比较(i/2)次,总共是 从第2个到第n个数
     * 所以总的比较次数:sum(i=2:n;i/2) =(n2/4)
     * 空间复杂都:O(1);
     * */
    /**
     * @param arr:要进行排序的数组
     */
    public static void directInsertSort(int[] arr){
        //1.拿到数组长度:
        int len = arr.length;
        int temp,j;
        //2.外层循环遍历要进行插入的无序元素;
        for(int i=1;i<len;i++){
            temp = arr[i];
            j = i-1;
            //内部循环判断:这个无序元素与有序序列的比较,从后向前;
            while(j>=0 && temp<arr[j]){
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = temp;
        }
    }
    /**
     * @param arr:要进行排序的数组
     * @param n:要进行排序数组中的元素个数
     */
    public static void directInsertSort(int[] arr,int n){
        int temp, j;
        //依次取出要进行排序的元素,我们默认第一个元素排好了序,因此int i =1;
        for(int i=1;i<n;i++){
            temp = arr[i];
            //这是第二步:从后向前遍历已经排好序的元素,和这个新元素一一比较;
            for(j=i-1;j>=0 && temp<arr[j];j--)
                arr[j+1] = arr[j];
            arr[j+1]= temp;
        }
    }


    /*希尔排序的基本思想:
     * 选定一个增量d<n,把全部记录按此值从第一个记录其进行分组,所有相距为d的记录作为一组;
     * 现在各个组内进行插入排序,然后减小间隔,取第二个增量d2<d;重复上述分组和排序过程,直至
     * di=1;即所有的记录放在同一组内排序;
     * 
     * 第一步:先将元素按某个增量d分成若干组,每组中的成员是由角标相差d的元素组成的,
     * 第二步:对每组中的元素进行 直接插入排序;
     * 第三步:缩减d使其以一个较小的增量再进行分组,
     * 第四步:重复1 2 3直到d=1;
     * 
     * 性能分析:
     * 希尔排序时间复杂都大约为 n的1.3次方;
     * */
    public static void shellSort(int[] arr,int n){  
        double d1=n;  
        int temp=0;  
        while(true){  
            d1= Math.ceil(d1/2); //防止出现d 等于0的时候这样程序就挂在哪里;
            int d=(int) d1;  
            //第分成的 d 组进行各自的直接插入排序;
            for(int x=0;x<d;x++){  
                int j;
                //每组内进行直接插入排序(注意每组中的成员是角标相差d的元素组成的);
                for(int i=x+d;i<n;i=i+d){ 
                    temp=arr[i];  
                    //和本组中已经排好序的元素,进行从后向前的扫描;
                    for(j=i-d;j>=0 && temp<arr[j];j=j-d){  
                        arr[j+d]=arr[j];  
                    }  
                    arr[j+d]=temp;  
                }  
            }  
            if(d==1)  
                break;  
        }  
    }  
}

//2.交换排序
class ChangeSort{
    /*1.冒泡排序的基本思想:
     *  通过相邻的记录的两两比较和交换,使关键字较小的记录如同水泡一样逐步向上漂浮(数组头)
     *  而关键字较大的记录好比石头一样往下沉,每一趟,都有最大的一块石头沉入水底;
     * 基本思路:
     * 先将一个记录的关键字和第二个记录的关键字进行比较,若为逆(左边小于右边),则交换两个记录
     * 然后比较第二个记录和第三个记录,……如此下去,直到第n个和第n-1个进行比较,
     * 算法实现:
     *  第一步:先把最大的元素放到最后;
     *  第二步:在把前 n-1个元素进行第一步操作;
     *  第三步:重复 直到n=1;
     * 
     * 性能:
     * 总的时间复杂度O(n2)
     * 
     * */
    public static void bubbleSort(int[] arr,int n){
        //n个元素的一组数据进行排序;
        int temp;
        for(int i=0;i<n;i++){
            //把这组元素中 数值最大的放到最后
            for(int j=0;j<n-1;j++){
                if(arr[j]>arr[j+1]){
                    temp =arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            //让组中的元素个数减 1;
            n--;
        }
    }

    /*
     * 2.快速排序
     *  快速排序是对冒泡的一种改进,冒泡中记录的比较和交换是在相邻的单元中进行的;记录
     *  每次交换只能上移或者下移一个单元,因而总的比较和移动次数较多,快速排序改进后,
     *  让记录的比较和交换从两端向中间进行,关键字较小和较大的记录一次就能换到前面和后面;
     *  基本思路:
     *      在待排序的n个记录中任选一个记录,通常取第一个记录,以该记录的关键值为基准,
     *      用交换的方式将所有的记录分成两部分,所有关键字比它小的记录,均排在它的之前,
     *      所有关键字比它大的都排在它的后面,这样就完成了一次排序,然后对分出的两个部分
     *      再进行上述排序,直到每部分只有一个记录为止,排序结束;
     *  待排序记录:r[t] r[t+1] r[t+2]......r[w-1] r[w];
     *  算法思路:
     *      第一步:设置两个变量 i ,j ,确定第一个记录为基准记录并让i为r[t]的脚标,
     *              j为r[w]的脚标
     *      第二步:先从j 所指示的位置向前扫描,当r[t]>r[j]时,交换r[t] 和 r[j].
     *              使关键字值比基准记录的关键字值小的记录交换到前面;
     *      第三步:从i所指示的位置向后扫描,直到 r[t]<r[i] 交换
     *      第四步:重复上述 2,3直到i=j;为一趟排序
     * */

    public static void quickSort(int[] arr, int low, int high) {
        int temp;
        int i,j;
        if(low<high){
            i = low;
            j= high;
            temp =arr[i];
            //进行一趟排序直到 i= j结束
            while(i<j){

                //j 向左扫描,直到找到关键字值比基准记录的值小的记录;
                while(i<j && (arr[j]>=temp)){
                    j--;
                }
                //找到,则交换arr[i]和arr[j]的位置,并让 i 指向后一个元素
                if(i<j){
                    arr[i] = arr[j];
                    i++;
                }

                //i 向右扫描,直到找到关键字值比基准记录的值大的记录;
                while(i<j && arr[i]<=temp){
                    i++;
                }
                //找到,则交换arr[i]和arr[j]的位置,并让 j指向前移动一个元素
                if(i<j){
                    arr[j] = arr[i];
                    j--;
                }       
            }
            arr[i] = temp;
            //递归处理左区间:
            quickSort(arr,low,j-1);
            //递归处理右区间
            quickSort(arr,j+1,high);
        }
    }




    public static void quickSort(int[] a) {
        if(a.length>0){
            quickSort2(a,0,a.length-1);
        }
    }
    private static void quickSort2(int[] a, int low, int high) {
        if(low<high){ 
            int middle = getMiddle(a,low,high);
            quickSort(a, 0, middle-1);
            quickSort(a, middle+1, high);
        }
    }

    private static int getMiddle(int[] a, int low, int high) {
        int temp = a[low];//基准元素
        while(low<high){
            //找到比基准元素小的元素位置
            while(low<high && a[high]>=temp){
                high--;
            }
            a[low] = a[high]; 
            while(low<high && a[low]<=temp){
                low++;
            }
            a[high] = a[low];
        }
        a[low] = temp;
        return low;
    }

}


//选择排序
/*选择排序是指每次从待排序的记录中选择出关键字值最小(最大)的记录,顺序放在已经排好
 * 顺序的有序序列中,直到全部排完;
 * 
 * */
class SelecteSort{
    /*1.简单选择排序;
     * 基本思想:
     *  对待排序的数组,进行n-1趟扫描,第i趟扫描选出剩下的n-i+1个记录中关键字值最小的记录
     *  和第i个记录交换,:
     *  第一次排序空间:r[1] - r[n] 把经过比较和交换后 把最小的元素放在r[1]中,
     *  第二次排序空间:r[2] - r[n] 经过选择和交换后,r[2]中放次小的记录,
     *  .....
     * 
     * */
    /**
     * @param arr:要进行简答选择排序的数组
     * @param n:数组中的前多少项元素进行排序;
     */
    public static void simpleSelecteSort(int[] arr,int n){
        int temp;
        for(int i=0;i<n;i++){
            int position = findMin(arr,i,n);
            //将最小的元素和起始元素发生交换;
            temp = arr[i];
            arr[i] = arr[position];
            arr[position] = temp;
        }
    }
    /**
     * @return :元素值最小的角标
     */
    private static int findMin(int[] arr,int low,int high){
        int position = low;
        for(int i=low+1;i<high;i++){
            if(arr[i]<arr[position])
                position = i;
        }
        return position;
    }


}



其各个函数运行结果,本人已经验证过了木有问题的;

【数据结构】七大排序算法(超详细) 本文详细介绍了数据结构中的七大排序算法 阅读详情

相关推荐

Java数据结构方面的面试试题以及答案解析

哈希表是一种通过哈希函数将键映射到存储桶中的数据结构,以实现快速的查找、插入和删除操作。在Java中,HashMap是一个常见的哈希表实现。

HappyAcmen 1111

《Java数据结构和算法》双端链表

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34088838的博客 123

Java数据结构与排序算法动态演示

在软件开发领域,数据结构和排序算法是构建高效程序的基础。Java作为一种广泛使用的编程语言,提供了丰富的数据结构和成熟的排序算法实现。为了深入理解这些概念,本章将介绍数据结构和排序算法的定义、分类及其在Java中的应用。排序算法是一类重要的基础算法,用于将一组无序的数据按照特定的顺序重新排列。其定义包括比较两个元素的大小并按照特定规则交换位置,直到整个数据序列变得有序。排序算法在计算机科学和工程中扮演着至关重要的角色,从数据库索引优化、数据查询,到图形渲染和科学计算等多个领域都有广泛应用。

weixin_33240461的博客 1092

<五>java数据结构与算法 对象排序

实现对象排序有2种方式: 1,实现接口java.lang.Interface Comparable: 参数:T - 可以与此对象进行比较的那些对象的类型;此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。必须要实现compareTo(T o)方法 Comparable 是在集合内部定义的方法实现的排序,Com

学而不思则罔,思而不学则殆! 632

openai联合创始人用1000行纯C语言手搓的GPT-2训练代码

不久之前,特斯拉前 AI 总监、OpenAI 联合创始人 Andrej Karpathy 在社交媒体平台 X 上高调宣布,他友好地从 OpenAI 离职,未来将专注于“个人项目”,而后又口口声声说要尝试性地戒掉上网两周,去了 Bhutan(不丹王国)休假。然后就手搓如下代码,我们一起来欣赏.这段代码是一个GPT-2模型的训练实现,包括前向传播、后向传播、参数更新等过程。代码中包含了注释,解释了每个函数和代码块的作用。此外,还有一些辅助函数和结构体,用于数据加载、随机数生成和模型的初始化与释放。这个训练循环还

zhangzhechun的专栏 1208

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2939

【数据结构】-java实现希尔排序算法(五)

希尔排序算法的算法思想、动态演示、C++、python实现可以参考希尔排序算法详解 希尔排序是一种插入类排序。直接插入的加强版。 算法思想:参见希尔排序算法详解 算法的性能分析 希尔排序中相等数据可能会交换位置,所以希尔排序是不稳定的算法。 java实现希尔排序算法 public static int[] ShellSort(int[] arr){ int n=arr.leng...

小呼哥的博客 232

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

(Java数据结构和算法)希尔排序+快速排序

希尔排序 每隔一定间隔组成一个序列,对这个序列进行排序。逐渐缩短间隔,最后一次间隔必定是1。间隔的变化可以自行确定,书中介绍了h = 3*h + 1的变化策略。 public class Main { public static void main(String[] args){ int[] a = {2, 3, 9, 1, 66, 4}; shellSort(a); pr...

ccnuacmhdu的博客 246

MATLAB功率谱函数psd与pwelch的使用

在网上看到 clear; Fs=1000; n=0:1/Fs:1; y=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n)); Nfft=1000; window=hanning(100); noverlap=20; dflag='none'; [Pxx,f]=psd(y,Nfft,Fs,window,noverlap); figure plot(f,10*log10(Pxx)); xlabel('frequency/Hz');ylab

qq_41687938的博客 2万+

MALTAB程序利用质心法去寻峰

质心法的优点是简单易实现且计算速度快,适用于数据点较少或峰值较明显的情况。然而,对于复杂的数据或多峰曲线,质心法可能无法准确识别所有峰值,因此在这些情况下可能需要使用更复杂的峰值检测算法。质心法(Centroid Method)是一种寻找峰值的方法,其基本原理是通过计算数据窗口内的质心位置来确定峰值的位置。质心是指在一维数据中,按照数据的幅值对位置进行加权平均的结果,即质心位置为数据幅值加权平均值的位置。变量定义了计算质心的窗口大小。最后,绘制了找到的峰值位置和幅值点,并显示了找到的峰值位置和幅值的结果。

走向CTO的路上... 1345

java基础知识---------变量与数据结构

我们用java写程序,那么程序是什么呢。程序就是数据结构+算法,也就是说我们写的程序从本质上来说就是就是对数据的操作,数字,文字,图片,音频,视频这些都是数据的一种形式,我们通过编程来操纵这些数据,从而实现不同的功能。 说到数据必然离不开变量,变量用来存放零时的计算结果,也就是说变量是存储数据的空间,用来指代一个数据。 一....

weixin_34072159的博客 277

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1850

十大经典排序算法之冒泡排序(1)

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。 作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一...

BoomLee的博客 609

海康威视 2024届 数字逻辑设计 实习笔试分析

记录一下 5月11日晚,做的海康威视的一场笔试。分享给需要的IC人。 岗位:数字逻辑设计工程师(浙江 杭州) 转载需要本人同意! 我的见解不一定都是准确的,欢迎评论区交流指正~~

记录所学,分享知识,结识挚友 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java数据结构与算法入门

第一部分:Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系。而各数据元素之间的相互关系,又包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。而一个数据结构的设计过程分成抽象层、数据结构层和实现层。数据结构在Java的语言体系中按逻辑结构可以分为两大类:线...

qq_37101453的博客 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构之美:如何优化搜索和排序算法

数据结构和算法是计算机科学的重要基础,对于编写高效的程序至关重要。通过优化搜索和排序算法,我们可以显著提高算法的性能。然而,优化算法并不是一蹴而就的事情,需要不断学习和实践,以不断提高编程技能。在实际应用中,选择合适的数据结构和算法是至关重要的,不同的问题可能需要不同的算法来解决。因此,对于程序员来说,不仅要了解各种算法和数据结构,还要具备判断何时使用它们的能力。通过不断学习和实践,我们可以不断提高自己的编程水平,编写出高效、可维护的代码。😊🙏Java面试技巧。

学IT,找陈寒 9395

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Java 数据结构】常见排序算法(上)

本期主要讲解: 1、 认识排序 2、常见排序的分类 3、直接插入排序 4、希尔排序(缩小增量排序) 5、选择排序 6、堆排序

程序猿教你打篮球的博客 4466

十大经典排序算法——java语言

一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、堆排序 八、计数排序 九、桶排序 十、基数排序

weixin_56781779的博客 7036

数据结构-8.Java. 七大排序算法(上篇)

1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。

薯条不要番茄酱的博客 1万+

【数据结构】之排序算法综合篇

博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多支持与指教。 本文首发于此 博主:威威喵|博客主页:https://blog.youkuaiyun.com/smile_running 数据结构课程的内容基本忘光了,所以又拾起数据结构与算法的书本,重新学习了一边排序算法的原理和实现,在经过几个晚上的努力,终于把这几种排序算法给搞明白了,下...

你若盛开,蜜蜂自来 7661

数据结构排序算法

直接插入排序(Insertion Sort)是一种简单的排序算法,其主要思想是把待排序的元素插入到已经排好序的部分中,从而得到一个新的有序序列。直接插入排序的时间复杂度为,其中 n 表示数组的长度。当数组已经有序时,时间复杂度为 O(n)。关于比较次数,最坏情况下,即待排序的序列为逆序时,直接插入排序的比较次数最多。具体来说,对于长度为 n 的数组,最坏情况下的比较次数为 ,即大约为。在最好情况下,即待排序的序列已经有序时,直接插入排序的比较次数仅为 n-1。

qq_61726001的博客 1555

【数据结构与算法】Java实现七大排序算法汇总

凿壁偷光,8000字总结Java实现七大排序算法!

冲击大厂之路!!! 2617

【数据结构】用Java实现七大排序算法(万字详解)

本章详解了数据结构中的七大排序算法,其中内容包括每一个算法的原理以及附上图片(分析了时间复杂度和空间复杂度,详细解析了每一个算法的优缺点),最后用Java代码实现每一个排序算法。

yican2580的博客 1471

数据结构排序算法实验报告_手敲一遍数据结构和排序算法

排序算法性质记忆冒泡排序选择排序插入排序快速排序归并排序希尔排序堆排序数据结构数组堆栈队列链表二叉树二叉搜索树图哈希表搜索广度优先搜索深度优先搜索附件排序算法代码图解Java数据结构和算法.pdf​sxf1024.lanzoui.com排序算法性质记忆1、关于稳定性不稳定: 快选堆希(快速排序、选择排序、堆排序、希尔排序)稳 定: 插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排...

weixin_39665507的博客 2427
上一篇: java枚举:初学(2)
下一篇: java:Swing(1)模拟随机抽签
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值