基本排序算法

十大基本排序算法的简易可视化 本文利用Microsoft Visual Studio的C语言编写平台及其自带的输出窗口尝试制作了十种基本排序算法的简单可视化。最终的输出都是文字、数字与符号,笔者已经尽力调整其位置以让结果尽可能清楚。本来是自己在学习排序算法的时候希望可以看到输入的数据在计算机内部被操作的过程,这样方便理解,同时又想用尽可能简单(懒)的方式实现,所以做了这些尝试。相比于网上的动画式可视化工具,本方法在视觉效果上略逊一筹。 阅读详情

插入排序:


    /*      相对稳定的
     *      最好时,数列相对有序,时间复杂度O(n)
     *      最差:为双层嵌套循环,其时间复杂度为O(n2)
     */
    public static void sort(int[] array){
        for(int i=1;i<array.length;i++){
            int temp=array[i];
            int j=i;
            for(;j>0&&array[j-1]>temp;j--){
                array[j]=array[j-1];
            }
            array[j]=temp;
        }
    }

选择排序:


    /**
     *   其时间复杂度为O(n2)   
     *
     */
    public static void sort(int[] array){
        int length=array.length;
        for(int i=0;i<length;i++){
            int minIndex=i;
            //在当前值之后查找最小值的index
            for(int j=i+1;j<length;j++){
                if(array[j]<array[minIndex]){
                    minIndex=j;
                }
            }
            if(minIndex!=i){
                int temp=array[minIndex];
                array[minIndex]=array[i];
                array[i]=temp;
            }
        }
    }

堆建立与排序

```

/**
* 
* 堆:
*   1、插入操作:
*       树的高度为log(n+1),时间复杂度为O(logn)
*   2、删除操作:
*       树的高度为log(n+1),时间复杂度为O(logn)
*   3、堆排序:
*       进行n次插入,时间复杂度为O(nlogn)
*       遍历删除的时间n*logn,时间复杂度为O(nlogn)
*       平均时间复杂度为:O(nlogn)
*/
public class Test {
public static void main(String[] args) {
    Heap heap=new Heap(20);
    heap.insert(2);
    heap.insert(4);
    heap.insert(9);
    heap.insert(3);
    heap.insert(5);
    heap.printAll();
    heap.delete();
    heap.printAll();        
    heap.sort();
}
}

class Heap{
    private int[] element;
    public Heap(int maxsize){
        element=new int[maxsize+1];
        element[0]=0;
    }
    //判空
    public boolean isEmpty(){
        return element[0]==0;
    }
    //判满
    public boolean isFull(){
        return element[0]==element.length-1;
    }
    //插入
    public void insert(int value){
        if(isFull()){
            throw new IndexOutOfBoundsException("大顶堆已满");
        }
        if(isEmpty()){
            element[1]=value;
        }else{
            //确定下标
            int i=element[0]+1;
            while(i!=1&&value>element[i/2]){
                //若比父节点大时,父节点下移
                element[i]=element[i/2];
                i/=2;
            }
            element[i]=value;
        }
        element[0]++;
    }
    //大顶堆的删除
    //即删除最大元素
    public int delete(){
        if(isEmpty()){
            throw new IndexOutOfBoundsException("大顶堆已空");
        }
        //删除元素,先赋值为最后一个有效元素
        int deleteElement=element[1];
        element[1]=element[element[0]];
        element[0]--;
        int temp=element[1];
        //重建堆
        int parent=1;
        int child=2;
        //循环至叶子节点
        while(child<=element[0]){
            if(child<element[0]&&element[child]<element[child+1]){
                //如果左孩子的值小于右孩子,那么选择右孩子比较
                child++;
            }
            if(temp>element[child]){
                break;
            }else{
                element[parent]=element[child];
                //父节点下移,其子节点设为左孩子节点
                parent=child;
                child*=2;
            }       
        }
        element[parent]=temp;
        return deleteElement;
    }
    public void printAll(){
        for(int i=1;i<element[0]+1;i++){
            System.out.print(element[i]);
            if(i!=element[0]){
                System.out.print(",");
            }
        }
        System.out.println();
    }
    //堆排序
    public void sort(){
        if(isEmpty()){
            throw new RuntimeException("堆为空");
        }
        //依次删除元素,放入数组最后
        int size=element[0];
        for(int i=0;i<size;i++){
            int deleteElement=delete();
            element[element[0]+1]=deleteElement;
        }
        //输出
        for(int i=1;i<size+1;i++){
            System.out.print(element[i]);
            if(i!=size){
                System.out.print(",");
            }
        }
    }
}

归并排序:


/**
 * 
 * 归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。
 *  java中Arrays.sort()采用了

一种名为TimSort的排序算法,就是归并排序的优化版本。
 *  每次合并操作的平均时间复杂度为O(n),
 *  总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
 * 
 * 参考:: <http://www.cnblogs.com/chengxiao/> 
 */
public class Test {
    public static void main(String[] args) {
           int []arr = {9,8,7,6,5,4,3,2,1};
           MergeSort m=new MergeSort();
           m.sort(arr);
           System.out.println(Arrays.toString(arr));
    }
}
class MergeSort {
    public static void sort(int []arr){
        //在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        int []temp = new int[arr.length];
        sort(arr,0,arr.length-1,temp);
    }
    private static void sort(int[] arr,int left,int right,int []temp){
        if(left<right){
            int mid = (left+right)/2;
            sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
            sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序

            merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
        }
    }
    private static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//左序列指针
        int j = mid+1;//右序列指针 
        int t = 0;//临时数组指针
        while (i<=mid && j<=right){
            if(arr[i]<=arr[j]){
                temp[t++] = arr[i++];
            }else {
                temp[t++] = arr[j++];
            }
        }
        while(i<=mid){//将左边剩余元素填充进temp中
            temp[t++] = arr[i++];
        }
        while(j<=right){//将右序列剩余元素填充进temp中
            temp[t++] = arr[j++];
        }
        t = 0;
        //将temp中的元素全部拷贝到原数组中
        while(left <= right){
            arr[left++] = temp[t++];
        }
    }
机器学习:Friedman检验与Nemenyi后续检验,Python实现 前言 本人大数据专业初入大三刚刚接触机器学习这一课程,教材是最典型的西瓜书,第一次作业当然就是利用本专业语言多功能python语言结合书内容尝试自己构建P-R曲线以及延伸指标曲线。当然初入一些算法和机器学习的一些库还不是很熟练掌握,有待提升自己的编程结合能力。在此领域本人有诸多不明确疑问,可能文章会有些许错误,望大家在评论区指正,本篇文章错误将会不断更正维护。 具体代码实现参考:https://blog.youkuaiyun.com/qqMiSa/article/details/98660515 提示:以下... 阅读详情

相关推荐

十种基本排序算法

十种基本排序算法 代码自己慢慢找哈 #define _CRT_SECURE_NO_WARNINGS #include<Windows.h> #include<stdio.h> #define MaxSize 10//归并排序,桶排序等排序时需要申请和原数组一样大小的空间时用到,方便修改 //快排 int QuickShortchild(int *str, int lef...

wolfGuiDao的博客 2531

Friedman检验的平均排名

Friedman检验的平均排名实际上也就是一个平均排名 format short data = rand(28, 6); % 六个算法28个测试函数 [~, ~, rk] = friedman(data); rk = rk.meanranks [~, idx] = sort(data, 2); % 按行排序,第idx(i,j)个算法在第i函数上的排名为j [~, rktmp] = find(idx==6); % 得到第六个算法在每个函数上的排名 rk6 = sum(rktmp)/length(rkt

qq_43015237的博客 8351

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 272

python计算Friedman排名代码

【代码】python计算Friedman排名代码。

大模型天花板 1001

从零到一:用MSC Nastran Patran搞定悬臂翼颤振分析(附完整模型文件)

本文详细介绍了使用MSC Nastran和Patran进行悬臂翼颤振分析的完整流程,从几何建模、网格划分到模态分析和颤振求解。通过具体案例讲解关键参数设置和操作技巧,帮助工程师掌握气动弹性分析的核心方法,并附赠完整模型文件供实践参考。

weixin_42563415的博客 441

物联网开发笔记(34)- 使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

zhusongziye的博客 1万+

八种基本排序及其时间复杂度

排序的例子(步骤)是方便理解用的,与程序无关,程序自动生成n个随机数排序并输出运算时间,如想输出排序后的数,请自行更改 1.冒泡排序 将相邻的两个数两两比较,每次外循环都将最大的数移到最后,每次内循环比较两个数,如果后一个数小于前一个数,两个数交换。 15 6 3422 8 12 30 6 15 228 12 30 34 6 158 12 2230 3...

yang03_26的博客 3万+

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 251

Friedman test 和 Bonferroni-Dunn test 整理

Friedman test 和 Bonferroni-Dunn test 是作者写论文时遇到的,经查阅相关文献,内容整理如下,如有错误,还望指正。

weixin_34279184的博客 6074

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

uniapp - 超详细的 H5 公众号网页微信登录示例代码,提供从 0-1 公众号配置及详细注释代码(站在新手小白的角度)第三方微信授权登录的实现!!

uniapp微信浏览器H5授权微信登录,UniApp开发H5接入微信登录的全过程,uniapp的H5页面使用微信登录,uniapp H5微信授权登录,H5之微信授权登陆 (uniapp网页版微信授权登录),uni-app开发H5第三方微信授权登录的实现,uniapp如何实现微信授权登录,公众号H5页面接入微信登录流程,uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级

✅ 精选推荐文章 1万+

搞懂基本排序算法

搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;本文写的内容是最近学习的算法相关知识中的基本排序算法,排序算法也算是面试中的常客了,实际上也是算法中最基本的知识。由于 Android 开发中用到的地方并不多,所以也很容易遗忘,但是为了进阶高级工程师巩固基本算法和数据结构也是必修课程之一。 基本排序算法按难易程度来说可以分...

王小六的博客 786

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

基本排序算法总结

排序算法总结冒泡排序选择排序插入排序归并排序快速排序希尔排序基数排序计数排序桶排序Tim排序 冒泡排序 冒泡算法是基于比较的排序算法,排序思想:当前元素比下一个元素大(或小)的时候,就与之进行交换。 void BubbleSort(vector<int> &nums) { for(int i=0;i<nums.size()-1;i++) { for(int j=0;j<nums.size()-i-1;j++) { if(nums[j]>nums[j+1

weixin_42168958的博客 223

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流

所有记忆都存在本地。

步子哥的博客 1064

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基本排序算法小结

一、插入排序 1  排序思想     将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。 直到所有的记录都插入完为止。复杂度为O(n2) 。     设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分: ◆ R[1…i-1]:已排好序的有序部分; ◆ R[i…n]:未排好序的无序部分。

肖氏专栏 2158

数学建模模型总结

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

基本的排序算法

基本的排序算法 Java实现各种基本的排序算法 冒泡排序 冒泡排序:这种排序方法是通过相邻的两个元素两两比较,根据大小来交换位置,最值元素就像气泡一样从左侧向右侧移动,故名冒泡排序。 public class BubbleSort { public static void main(String[] args) { int []a= {9,3,1,4,6,8,7,5,2}; sort(a); print(a); } //冒泡排序 static void sort(int[] a)

weixin_43731014的博客 303

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

三个基本排序算法

1选择排序 1.1过程分析 对于一个不确定的整形数组,首先将i=0所在的数和后面的所有数进行比较,找出最小的数i=j交换数组中的数,下一次再从i=1开始比较,直到i=num.length-1 1.2动画分析 1.2算法描述 public class selectsort { public static void main(String[] args) { int[] num= {2,3,5,4,1,9,8,7};//要排序的数组 T1(num); for(int n:num) //增强型f

正在自我救赎的菜鸟。本人所有内容均不收费,可随意转发,复制 1192

PHP基本排序算法

基本排序算法 bubblesort 冒泡排序 insertsort 插入排序 shellsort 希尔排序 selectsort 简单查找排序 quicksort 快速排序 &lt;?php /* * bubble的原理:数组的前两个数字对比 * 每次数字大的后移一位 * 如果数字的长度是10 需要最多排序9次 */ function bubbleSort(array $numbe...

Aspire 200

排序算法之基本几种排序方法

排序算法 什么是排序算法 基本都排序算法有哪些 怎么衡量排序算法的优劣 冒泡排序的思想与c语言代码 插入排序的思想与c语言代码 1.什么是排序算法。 当你有一堆数据的时候,看着他们杂乱无章,无序的时候是不是看着特别不爽。是不是特想看着它们是从小到大,或者从大到小排列的,看着就舒服多了。还有哦,排序可不止是让你看着舒服,还有一部分是查找。在一堆数据中查找是否存在一个数据,如果是一堆杂乱无章的数据,我们就只能一个个比较,是否是你要的那个数据,...

m0_57614828的博客 2089

三种基本排序算法

三种基本排序排序算法 1.冒泡排序 基本原理: {3,5,4,2,6,1} 比较前两个元素{【3,5】,4,2,6,1} 3&amp;lt;5 保持不变 {3,[5,4],2,6,1} {3,4,[5,2],6,1} {3,4,2,[5,6],1} {3,4,2,5,[6,1]} {3,4,2,5,1,6} 第一遍排序完成,进行下一次排序,依次类推 由于最后一个元素已经是最大的...

weixin_42481455的博客 532

排序算法基本思想

 转自:http://yijiaotest.rdedu.net/yijiaotest/web/200552432039930/app/readnews.asp?id=8一、插入排序(Insertion Sort)1. 基本思想:  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。2. 排序过程: 【示例】:[初始关键字] [

Day day up! 1524
上一篇: java中的“==”
下一篇: 集合类LinkedList简单的实现
linkingfei
博客等级 码龄10年 494粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值